Flask_SQLAlchemy创建数据库、数据操作和Manager命令

本文介绍了如何使用Flask_SQLAlchemy整合Flask和SQLAlchemy,实现数据库创建、数据操作以及通过命令行执行特定函数。详细讲解了数据库配置、ORM模型创建、数据的增删查改,并展示了如何利用Flask_Script添加命令行方法,包括固定返回的greet方法和需要传参数的add_student方法。

1.Flask_SQLAlchemy创建数据库

Flask_SQLAlchemy整合了Flask和SQLAlchemy的功能,让我们能够使用更少的代码实现在网站中调用数据库的功能。

首先使用命令在终端窗口安装Flask_SQLAlchemy,

pip install flask_sqlalchemy

接下来我们在app实例文件中,为app绑定数据库。

首先实例化app,

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)  # 实例化app对象

接下来,输入数据库格式化字符串,如,

HOSTNAME = '127.0.0.1'
PORT = '3306'
USERNAME = 'root'
PASSWORD = '******'
DATABASE = 'test'
DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8mb4'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)

为app对象的配置文件添加SQLALCHEMY_DATABASE_URI和SQLALCHEMY_TRACK_MODIFICATIONS参数,其中SQLALCHEMY_DATABASE_URI的参数为数据库格式化字符串DB_URI;SQLALCHEMY_TRACK_MODIFICATIONS默认开启,开启此选项会占用大量内存,所以我们关闭它,

app.config['SQLALCHEMY_DATABASE_URI'] = DB_URI
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

Flask_SQLAlchemy将SQLAlchemy的功能进行了整合,我们之前介绍的SQLAlchemy方法都可以通过数据库变量来引用,不需要再一一导入,只需实例化数据库对象,

db = SQLAlchemy(app)
# 之后所有的SQLAlchemy都可以通过“db.方法名”来调用,如,db.Column,db.String等

我们下面来构建两个ORM模型,分别为Student表和StudentExtend表。Student表中有id字段(数值型,主键,自增)、name字段(字符型,非空)、age字段(数值型)、sex字段(枚举型,值为“男”或“女”);StudentExtend表有num字段(数值型,主键,自增)、name字段(字符型,非空)、id字段(数值型,外键对应Student表的id字段)、rank字段(数值型)、hobby字段(字符串类型),两张表为一对多的关系。代码如下,

class Student(db.Model):  # 继承于db.Model类
    __tablename__ = 'student'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(10), nullable=False)
    age = db.Column(db.Integer)
    sex = db.Column(db.Enum("男", "女"))

    def __repr__(self):
        return 'Student(name:{}, age:{}, sex:{})'.format(self.name, self.age, self.sex)


class StudentExtend(db.Model):
    __tablename__ = 'student_extend'
    num = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(10), nullable=False)
    id = db.Column(db.Integer, db.ForeignKey('student.id'))
    rank = db.Column(db.Integer)
    hobby = db.Column(db.String(50))

    student = db.relationship("Student", backref="extends")

    def __repr__(self):
        return 'StudentExtend(name:{}, rank:{}, hobby:{})'.format(self.name, self.rank, self.hobby)


db.drop_all()  # 删除所有ORM模型
db.create_all()  # 创建所有ORM模型

最后添加视图函数,

@app.route('/')
def hello_world():
    return 'Hello World!'


if __name__ == '__main__':
    app.run(debug=True)

这样,我们启动后数据库会被自动创建。

我们为了简化代码,可以新建一个config.py文件,将app实例文件中的数据库格式化字符串剪切到config.py文件中,并进行修改,

HOSTNAME = '127.0.0.1'
PORT = '3306'
USERNAME = 'root'
PASSWORD = '******'
DATABASE = 'test'
DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8mb4'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)

SQLALCHEMY_DATABASE_URI = DB_URI
SQLALCHEMY_TRACK_MODIFICATIONS = False

同时,在app实例文件中导入config.py,在实例化app对象后添加以下代码,

import config

app.config.from_object(config)

2.数据操作

Flask_SQLAlchemy中对数据的操作与SQLAlchemy中基本相同。

我们来添加几个数据,

student1 = Student(name='zhao', age=23, sex="女")
student2 = Student(name='qian', age=20, sex="男")

extend1 = StudentExtend(name='zhao', rank=1, hobby="conding")
extend2 = StudentExtend(name='qian', rank=4, hobby="math")

extend1.student = student1
extend2.student = student2

db.session.add_a。ll([extend1, extend2])
db.session.commit()

我们来查询age为23的学生对应的extend,

student1 = db.session.query(Student).filter(Student.age == 23).first()
print(student1.extends)

执行后,会返回student1.extends的结果如下,

[StudentExtend(name:zhao, rank:1, hobby:conding)]

我们将其年龄修改为27,并返回,

student1.age = 27
db.session.commit()
print(student1)

返回,

Student(name:zhao, age:27, sex:)

我们删除该数据,

db.session.delete(student1)
db.session.commit()

3.命令行执行函数方法

3.1.添加命令行方法

我们可以使用Flask_Script来实现终端命令行执行特定函数。

首先,我们来新建一个manage.py文件,代码如下,

from flask_script import Manager

manager = Manager(app)

if __name__ == '__main__':
    manager.run()

这是一个入口文件的标准形式,我们接下来为入口添加命令行方法greet,该方法固定返回“hello world”,

@manager.command  # 为manager添加新命令行命令
def greet():
    return "hello world"

这样,我们可以在终端窗口输入以下代码,

python manage.py greet

终端会返回,

hello world

我们同样可以,将方法写入其他文件再导入到入口文件中,实现同样的效果。例如,我们新建一个db_script.py文件来写入相关方法,

from flask_script import Manager

db_manager = Manager()


@db_manager.command
def init():
    return "初始化迁移脚本"


@db_manager.command
def revision():
    return "生成迁移脚本"


@db_manager.command
def upgrade():
    return "脚本映射到数据库成功"

在入口文件中添加以下代码,

from db_script import db_manager

manager.add_command("db", db_manager)  # 为manager添加db_manager的方法
# 第一个参数为方法前缀,所有的db_manager方法都要通过“前缀名 方法名”的形式在终端中运行

我们在终端中输入,

python manage.py db init

返回,

初始化迁移脚本

3.2.添加需要传参数的命令行方法

如果,我们添加的命令行方法需要我们传参,需要在方法前添加@manager.option(“参数前缀名”, “参数名”, dest=“对应参数”)实现传参,例如,我们添加一个add_student()方法来向数据库中的Student表添加数据,

from app import app, db, Student  # 从app实例文件中导入相关对象


@manager.option("-n", "--name", dest="name")  # 指定-n为传递add_student的name参数
@manager.option("-a", "--age", dest="age")  # 指定-a为传递add_student的age参数
@manager.option("-s", "--s", dest="sex")  # 指定-s为传递add_student的sex参数
def add_student(name, age, sex):
    student = Student(name=name, age=age, sex=sex)
    db.session.add(student)
    db.session.commit()

我们来添加一条数据,

manage.py add_student -n sun -a 25 -s 女

这样数据库中就多了一条相应数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值