如何使用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)版本号
然后打开你的代码,可以发现他自动复原了!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。