多对多关系
hello.py
'''
多对多模型
学生选课:学生和课程
'''
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+pymysql://root:root@127.0.0.1:3306/student"
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
#创建选课模型
#创建学生
class Student(db.Model):
__tablename__ = "students"
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
name = db.Column(db.String(32))
#数据关系,反向关系,多对多二次查询
courses = db.relationship("Course",backref="students",secondary="tb_student_course")
#创建课程
class Course(db.Model):
__tablename__ = "courses"
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
name = db.Column(db.String(32))
#中间表
tb_student_course = db.Table(
"tb_student_course",
db.Column("student_id",db.Integer,db.ForeignKey(Student.id)),
db.Column("course_id",db.Integer,db.ForeignKey(Course.id))
)
@app.route('/')
def index():
return "<h1>Hello,World!</h1>"
if __name__ == "__main__":
db.drop_all()
db.create_all()
#添加测试数据
stu1 = Student(name="张三")
stu2 = Student(name="李四")
stu3 = Student(name="王五")
cou1 = Course(name="物理")
cou2 = Course(name="化学")
cou3 = Course(name="生物3")
stu1.courses = [cou2,cou3]
stu2.courses = [cou2]
stu3.courses = [cou1,cou2,cou3]
db.session.add_all([stu1,stu2,stu3])
db.session.add_all([cou1,cou2,cou3])
db.session.commit()
app.run(debug=True)
数据库迁移
前面几节数据删除增加重启脚本都恢复原状,真实情况下数据是实时更新的,因而产生了数据库迁移
数据库迁移:
1.是为了备份表的结构,并不备份数据
2.需要备份数据请使用navicate 来实现
3.更新过程的数据一般不丢失,但是降级的时候数据会丢失,表结构不会,降级请谨慎操
安装扩展
pip install flask_migrate
导入对象
from flask_migrate import Migrate
迁移命令
export FLASK_APP=xx.py
flask db init #初始化,只运行一次,生成migrations文件夹
flask db migrate -m "注释" #每次数据库更新的版本,方便回滚
flask db upgrade [version] #提交到数据库,更新数据库版本
flask db downgrade [version] #提交到数据库,回滚到老版本
flask db show #查看最新版数据库
flask db current #查看当前版本数据库
flask db history #查看历史版本数据库
初始化操作
更新数据库操作
回滚操作
重点
数据库迁移:
1.是为了备份表的结构,并不备份数据
2.需要备份数据请使用navicate 来实现
3.更新过程的数据一般不丢失,但是降级的时候数据会丢失,表结构不会,降级请谨慎操作