在开发过程中,需要修改数据库模型,而且还要在修改之后更新数据库。最直接的方式就是删除旧表,但这样会丢失数据。
更好的解决办法是使用数据库迁移框架,它可以追踪数据库模式的变化,然后把变动应用到数据库中。在Flask中可以使用Flask-Migrate扩展,来实现数据迁移。
环境:window11+pycharm2020.1+Anaconda4.11.0 +python3.7
Flask-sqlalchemy2.5.1
Flask-Migrate:3.1.0
安装Flask-Migrate。pycharm(或Anaconda Prompt)打开控制台,输入:
pip install flask-migrate
安装失败,在导入flask_migrate包的时候,遇到报错:alembic安装失败
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple flask_migrate
Collecting alembic>=0.7
Downloading https://pypi.tuna.tsinghua.edu.cn/packages/60/1e/cabc75a189de0fbb2841d0975243e59bde8b7822bacbb95008ac6fe9ad47/alembic-1.4.2.tar.gz (1.1 MB)
解决:
1.先安装其他历史版本的alembic,打开
alembic · PyPI
点击release history
进入历史版本列表,找到1.4.3版本,点击进入下载页:
点击Download files,下载 alembic-1.4.3-py2.py3-none-any.whl到本地文件夹:
2.打开控制台,cd 进入到放alembic-1.4.3-py2.py3-none-any.whl的文件夹:
输入:
pip install alembic-1.4.3-py2.py3-none-any.whl
3.提示安装Mako失败,打开
Mako · PyPI
下载Mako-1.2.1-py3-none-any.whl到本地文件夹:
4.打开控制台,cd 进入到放Mako-1.2.1-py3-none-any.whl的文件夹,输入:
pip install Mako-1.2.1-py3-none-any.whl
Mako安装成功
5.重新安装alembic,输入:
pip install alembic-1.4.3-py2.py3-none-any.whl
alembic安装成功。
6.再重新安装flask_migrate:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple flask_migrate
Flask-Migrate安装成功,安装版本为3.1.0。
总结:python相关的插件安装失败的话,查看到哪一步出的问题,然后到官网直接下载对应版本到本地,进行离线安装。
使用flask-migrate 3.1.0 迁移数据库。
flask-migrate 3.0以下一般和flask-script搭配使用,但是在3.0之后 flask-migrate去掉了MigrateCommand这个模块,根据flaks-migrate官方文档,只使用flask-migrate。
1.Flask-Migrate常用命令:
flask db history #查看历史迁移信息
flask db current #查看当前数据库版本
flask db init #初始化数据库
flask db migrate -m "init_database" #数据库迁移
flask db upgrade #更新数据库至最新版本
flask db upgrade revision_id #更新数据库至某一版本revision_id
flask db downgrade #回退一个版本
flask db downgrade revision_id #回退至某一版本revision_id
2.同步表结构,在控制台中执行命令
a. init 初始化,只需执行一次。
执行init命令,初始化一个迁移文件夹:
flask db init
执行完毕项目中生成一个migrations目录(如需重新init,需先删除该目录再init):
b. migrate--将模型的变更生成迁移文件
执行migrate命令,把当前的模型添加到迁移文件中:
flask db migrate
出现问题:
ModuleNotFoundError: No module named 'MySQLdb'
解决方案:安装pymysql并将数据库连接改为 mysql+pymysql:
c.update--谨慎使用:
当你执行upgrade的时候它就会把除了该程序之外的所有数据表都记录下来准备删除,一但你执行了update,那些非该程序的所有数据表都会被删除!
执行update命令,把迁移文件中对应的数据库操作,真正的映射到数据库中:
flask db upgrade
执行完毕,数据库中会生成对应的表:
[1] flask-migrate文档:
Flask-Migrate — Flask-Migrate documentation