在上一遍文章中,我们增加了两个模型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 Manager
from flask_migrate import Migrate, MigrateCommand
from HarpQA import app, db
from models import Users, Questions, Comments
manager = 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
字段已经添加到表中了。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。