在上一遍文章中,我们增加了两个模型Questions
和Comments
,并为Users
增加了avatar_path
这个字段,然后通过这段代码更新到数据库:
with app.test_request_context(): db.drop_all() db.create_all()
因为当使用过db.create_all()
之后,再次直接使用db.create_all()
,对模型的修改并不会更新到数据库,我们要使用db.drop_all()
先把数据库中所有的表先删除掉,然后再db.create_all()
一次。听上去是不是很麻烦?更糟糕的是,原先数据库的的数据也就没有了。所以我们不用这种简单粗暴的方式去更新数据库结构,而是借助flask-migrate
这个专门用于迁移数据库的工具,它可以在保留数据库原始数据的情况下,完成模型的更新。此外,我们还将结合flask-script
一起使用,简单来说flask-script
让我们可以使用命令行去完成数据库迁移的操作。
在项目主文件夹下新建一个manage.py
,代码如下:
from flask_script import Managerfrom flask_migrate import Migrate, MigrateCommandfrom HarpQA import app, dbfrom models import Users, Questions, Commentsmanager = Manager(app)migrate = Migrate(app, db)manager.add_command('db', MigrateCommand)if __name__ == '__main__': manager.run()
首先导入相关的类,注意模型要全部导入过来,即使代码中并没有显式地使用它们。然后传入app
或db
来构建Manager
和Migrate
两个类的实例,最后将MigrateCommand
的命令加入到manager
中。
此时我们假设要更新模型的结构,在models.py
的User
模型结尾添加一行代码test = db.Column(db.Integer)
,然后点击PyCharm下方的Terminal,自动进入到了虚拟环境的命令行中,输入python manage.py db init
来初始化,这一步主要是建立数据库迁移相关的文件和文件夹,只是在第一次需要使用。接着依次使用python manage.py db migrate
和python manage.py db upgrade
,待运行完成,查看users_infor
表的结构,结果如下:
可以看到test
字段已经添加到表中了。