15.Flask-SQLAlchemy-数据迁移
SQLAlchemy-数据迁移
- 在Flask中可以使用Flask-Migrate的第三方扩展,来实现数据迁移。并且集成到Flask终端脚本中,所有操作通过flask db 命令就能完成
pip install Flask-Migrate
代码示例:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
# 导入数据迁移核心类
from flask_migrate import Migrate
app = Flask(__name__)
class Config(object):
DEBUG = True
# 数据库连接配置
# SQLALCHEMY_DATABASE_URI = "数据库类型://数据库账号:密码@数据库地址:端口/数据库名称?charset=utf8mb4"
SQLALCHEMY_DATABASE_URI = "mysql://root:123@127.0.0.1:3306/flaskdemo?charset=utf8mb4"
# 动态追踪修改设置,如未设置只会提示警告
SQLALCHEMY_TRACK_MODIFICATIONS = True
# 查询时会显示原始SQL语句
SQLALCHEMY_ECHO = True
app.config.from_object(Config)
db = SQLAlchemy(app=app)
# 初始化数据迁移
migrate = Migrate(app, db)
# migrate = Migrate()
# migrate.init_app(app, db)
"""模型类定义"""
# 关系表的声明方式
achieve = db.Table('tb_achievement',
db.Column('student_id', db.Integer, db.ForeignKey('tb_student.id')),
db.Column('course_id', db.Integer, db.ForeignKey('tb_course.id'))
)
class Course(db.Model):
# 定义表名
__tablename__ = 'tb_course'
# 定义字段对象
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True)
price = db.Column(db.Numeric(6,2))
teacher_id = db.Column(db.Integer, db.ForeignKey('tb_teacher.id'))
students = db.relationship('Student', secondary=achieve, backref='courses', lazy='subquery')
# repr()方法类似于django的__str__,用于打印模型对象时显示的字符串信息
def __repr__(self):
return 'Course:%s'% self.name
class Student(db.Model):
__tablename__ = 'tb_student'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True)
email = db.Column(db.String(64),unique=True)
age = db.Column(db.SmallInteger,nullable=False)
sex = db.Column(db.Boolean,default=1)
def __repr__(self):
return 'Student:%s' % self.name
class Teacher(db.Model):
__tablename__ = 'tb_teacher'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True)
# 课程与老师之间的多对一关联
courses = db.relationship('Course', backref='teacher', lazy='subquery')
def __repr__(self):
return 'Teacher:%s' % self.name
@app.route("/")
def index():
return "ok"
if __name__ == '__main__':
app.run(debug=True)
创建迁移版本仓库
# 切换到项目根目录下 cd ~/Desktop/flaskdemo # 设置flask项目的启动脚本位置,例如我们现在的脚本叫manage.py export FLASK_APP=manage.py # 数据库迁移初始化,这个命令会在当前项目根目录下创建migrations文件夹,将来所有数据表相关的迁移文件都放在里面。 flask db init
创建迁移版本
-
-
upgrade():把迁移中的改动代码同步到数据库中。
-
downgrade():则将改动代码从数据库中进行还原。
-
-
自动创建的迁移脚本会根据模型定义和数据库当前状态的差异,生成upgrade()和downgrade()函数的内容。
-
# 根据flask项目的模型生成迁移文件 -m的后面你不要使用中文!! flask db migrate -m 'initial migration' # 这里等同于django里面的 makemigrations,生成迁移版本文件 # 完成2件事情: # 1. 在migrations/versions生成一个数据库迁移文件 # 2. 如果是首次生成迁移文件的项目,则迁移工具还会在数据库创建一个记录数据库版本的version表
升级版本库版本
把当前ORM模型中的代码改动同步到数据库
# 从migations目录下的versions中根据迁移文件upgrade方法把数据表的结构同步到数据库中 flask db upgrade
降级版本库的版本
# 从migations目录下的versions中根据迁移文件downgrade把数据表的结构同步到数据库中 flask db downgrade
版本库的历史管理
flask db history 输出格式:<base> -> 版本号 (head), initial migration
回滚到指定的版本
flask db downgrade # 默认返回上一个版本 flask db downgrade 版本号 # 回滚到指定版本号对应的版本 flask db upgrade 版本号 # 升级到指定版本号对应的版本
数据迁移步骤
1. 初始化数据迁移的目录 export FLASK_APP=4-manage.py flask db init 2. 数据库的数据迁移版本初始化,生成迁移文件 flask db migrate -m 'initial migration' 3. 升级版本[新增一个迁移记录] flask db upgrade 4. 降级版本[回滚一个迁移记录] flask db downgrade

浙公网安备 33010602011771号