Lanms Blog

模型的一对多查询和数据迁移
Publish: 2019/3/27   

05-模型的一对多查询和数据迁移

1. 一对多查询

模型

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class Student(db.Model): # Many
    __tablename__ = 'tb_student'
    s_id = ... # 主键
    ...
    s_grade = db.Column(db.Interger, db.ForeignKey('tb_grade.g_id'))

class Grade(db.Model):  # one
    __tablename__ = 'tb_grade'
    g_id = # 主键
    ...
    students = db.relationship('Student', backref='stu', lazy=True)

查询


# 通过班级查学生,  g_id=2
grade = Grade.query.filter(Grade.g_id==2)
students_list = grade.studnets.all()

# 通过学生查询班级 s_id = 1001
student = Studnent.query.filter(Student.s_id==1001)
grade = student.stu    # relationship 中的 backref=stu

表的外键由db.ForeignKey指定,传入的参数是表的字段。db.relations它声明的属性不作为表字段,第一个参数是关联类的名字,backref是一个反向身份的代理,相当于在Student类中添加了stu的属性。

一对多, 多对多都是使用相同的原理来进行查询

2. 数据库迁移

在django中继承了makemigrations,可以通过migrate操作去更新数据库,修改我们定义的models,然后在将模型映射到数据库中。

在flask中也有migrate操作,它能跟踪模型的变化,并将变化映射到数据库中

安装migrate

pip install flask-migrate

配置使用migrate

初始化,使用app和db进行migrate对象的初始化

from flask_migrate import Migrate

#绑定app和数据库
Migrate(app=app, db=db)
2.2.2 安装了flask-script的话,可以在Manager()对象上添加迁移指令
from flask_migrate import Migrate, MigrateCommand

app = Flask(__name__)

manage = Manager(app=app)

manage.add_command('db', MigrateCommand)

操作:

python manage.py db init  初始化出migrations的文件,只调用一次

python manage.py db migrate  生成迁移文件

python manage.py db upgrade 执行迁移文件中的升级

python manage.py db downgrade 执行迁移文件中的降级

python manage.py db --help 帮助文档


← 模型的一对一/一对多/多对多 深入flask模型的查询 →

Powered by Hexo, Theme designs by @hpcslag.
Style-Framework Tocas-UI designs by @yamioldmel