如何使用Flask-Migrate拓展数据库表结构 前言 在我们用 sqlchemy 模块创建完几个表时,如果在实际生产环境中,需要对表结构进行更改,应该怎么办呢?总不能把表删除了吧,这样数据就会丢失了。 更好的解决办法是使用数据库迁移框架,它可以追踪数据库模式的变化,然后把变动应用到数据库中。 在Flask中可以使用Flask-Migrate扩展,来实现数据迁移。并且集成到Flask-Script中,所有操作通过命令就能完成。 操作示例: 1.首先需要安装 flask-migrate 模块,当然还有 flask-script 模块。 pip3 install flask-migrate pip3 install flask-script 2.代码: #coding=utf-8 from flask import Flask from flask_sqlalchemy import SQLAlchemy from flask_migrate import Migrate,MigrateCommand from flask_script import Shell,Manager app = Flask(__name__) manager = Manager(app) app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:mysql@127.0.0.1:3306/Flask_test' app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True db = SQLAlchemy(app) #第一个参数是Flask的实例,第二个参数是Sqlalchemy数据库实例 migrate = Migrate(app,db) #manager是Flask-Script的实例,这条语句在flask-Script中添加一个db命令 manager.add_command('db',MigrateCommand) #定义模型Role class Role(db.Model): # 定义表名 __tablename__ = 'roles' # 定义列对象 id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(64), unique=True) user = db.relationship('User', backref='role') #repr()方法显示一个可读字符串, def __repr__(self): return 'Role:'.format(self.name) #定义用户 class User(db.Model): __talbe__ = 'users' id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(64), unique=True, index=True) #设置外键 role_id = db.Column(db.Integer, db.ForeignKey('roles.id')) def __repr__(self): return 'User:'.format(self.username) if __name__ == '__main__': manager.run() 主要注意第8行-20行,48行。要把原来的代码改成这样。 3.命令行的操作 创建迁移仓库 这个命令会创建 migirations 文件夹,所有迁移文件都放在里面 python3 xxx.py db init 注:db 是20行决定了,可以更改 自动创建迁移脚本 python3 xxx.py db migrate -m"版本名(注释)" 更新数据库 python3 xxx.py db upgrade 当我们需要修改表结构时,直接在 xxx.py 里直接增删相应的代码 修改完成后,继续创建新的迁移脚本 python 文件 db migrate -m"新版本名(注释)" 更新数据库 python3 xxx.py db upgrade 更新完之后,其实就是提交操作,类似于 git 添加一个新的版本。 但是,如果我们想返回历史的版本,应该怎么操作呢? 先查看版本号 python xxx.py db history 然后记住想要返回的版本号。 返回指定的版本 python xxx.py db downgrade(upgrade) 版本号 然后打开你的代码,可以发现他自动复原了! 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持中文源码网。