如何使用Flask-Migrate拓展数据库表结构
前言
在我们用sqlchemy模块创建完几个表时,如果在实际生产环境中,需要对表结构进行更改,应该怎么办呢?总不能把表删除了吧,这样数据就会丢失了。
更好的解决办法是使用数据库迁移框架,它可以追踪数据库模式的变化,然后把变动应用到数据库中。
在Flask中可以使用Flask-Migrate扩展,来实现数据迁移。并且集成到Flask-Script中,所有操作通过命令就能完成。
操作示例:
1.首先需要安装flask-migrate模块,当然还有flask-script模块。
pip3installflask-migrate pip3installflask-script
2.代码:
#coding=utf-8 fromflaskimportFlask fromflask_sqlalchemyimportSQLAlchemy fromflask_migrateimportMigrate,MigrateCommand fromflask_scriptimportShell,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 classRole(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) #定义用户 classUser(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文件夹,所有迁移文件都放在里面
python3xxx.pydbinit
注:db是20行决定了,可以更改
自动创建迁移脚本
python3xxx.pydbmigrate-m"版本名(注释)"
更新数据库
python3xxx.pydbupgrade
当我们需要修改表结构时,直接在xxx.py里直接增删相应的代码
修改完成后,继续创建新的迁移脚本
python文件dbmigrate-m"新版本名(注释)"
更新数据库
python3xxx.pydbupgrade
更新完之后,其实就是提交操作,类似于git添加一个新的版本。
但是,如果我们想返回历史的版本,应该怎么操作呢?
先查看版本号
pythonxxx.pydbhistory
然后记住想要返回的版本号。
返回指定的版本
pythonxxx.pydbdowngrade(upgrade)版本号
然后打开你的代码,可以发现他自动复原了!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。