在開發過程中,需要修改數據庫模型,而且還要在修改之後更新數據庫。最直接的方式就是刪除舊表,但這樣會丟失數據。
更好的解決辦法是使用數據庫遷移框架,它可以追蹤數據庫模式的變化,然後把變動應用到數據庫中。在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