現在我們可以使用Flask-Migrate插件來解決之,Flask-Migrate插件是基于Alembic,Alembic是由大名鼎鼎的SQLAlchemy作者開發數據遷移工具。
具體操作如下:
1. 安裝Flask-Migrate插件
$ pip install Flask-Migrate
db = SQLAlchemy(app) migrate = Migrate(app, db) manager = Manager(app) manager.add_command('db', MigrateCommand)
3. 初始化
$ python app.py db init
使用Flask-Migrate遷移數據庫
隨著開發進度不斷向前,你會發現你的數據庫模型需要更改,而當這種情況發生時需要更新數據庫。
Flask-SQLAlchemy只有當數據庫表不存在了才從模型創建它們,所以更新表的唯一途徑就是銷毀舊的表,當然這將導致所有數據庫中的數據丟失。
有個更好的解決方案就是使用數據庫遷移框架。和源碼版本控制工具跟蹤更改源碼文件一樣,數據庫遷移框架跟蹤更改數據庫模型,然后將增量變化應用到數據庫中。
SQLAlchemy的主要開發人員寫了一個Alembic遷移框架,但我們不直接使用Alembic,Flask應用可以使用Flask-Migrate擴展,一個集成了Flask-Script來提供所有操作命令的輕量級Alembic包。
4. 創建遷移倉庫
首先,Flask-Migrate必須已經安裝到虛擬環境中:
(venv) $ pip install flask-migrate
下面展示擴展如何初始化:
from flask.ext.migrate import Migrate, MigrateCommand # ... migrate = Migrate(app, db) manager.add_command('db', MigrateCommand)
為了可以使用數據庫遷移命令,Flask-Migrate提供MigrateCommand類來連接Flask-Script的manager對象。在這個示例中使用db來連接到命令。
在數據庫遷移可以維護之前,必須通過init子命令來創建一個遷移庫:
(venv) $ python hello.py db init
Creating directory /home/flask/flasky/migrations...done Creating directory /home/flask/flasky/migrations/versions...done Generating /home/flask/flasky/migrations/alembic.ini...done Generating /home/flask/flasky/migrations/env.py...done Generating /home/flask/flasky/migrations/env.pyc...done Generating /home/flask/flasky/migrations/README...done Generating /home/flask/flasky/migrations/script.py.mako...done Please edit configuration/connection/logging settings in '/home/flask/flasky/migrations/alembic.ini' before proceeding.
這個命令創建一個migrations文件夾,里面存放了所有遷移腳本。
建議:如果你有克隆在GitHub上的應用程序,你現在可以運行git checkout 5c來切換到這個版本的應用程序。
5. 創建遷移腳本
在Alembic,數據庫遷移工作由遷移腳本完成。這個腳本有兩個函數,分別叫做upgrade()和downgrade()。upgrade()函數實施數據庫更改,是遷移的一部分,downgrade()函數則刪除它們。通過添加和刪除數據庫變化的能力,Alembic可以重新配置數據庫從歷史記錄中的任何時間點。
Alembic遷移可以分別使用revision和migrate命令手動或自動創建。手動遷移通過由開發人員使用Alembic的Operations對象指令實現的空upgrade()和downgrade()函數創建遷移框架腳本。另一方面,自動遷移通過尋找模型定義和數據庫當前狀態間的不同為upgrade()和downgrade()生成代碼。
警告:自動遷移并不總是準確的,可以忽略一些細節。所以應該經常審查一下自動生成的遷移腳本。
migrate子命令創建自動遷移腳本:
(venv) $ python hello.py db migrate -m "initial migration"
INFO [alembic.migration] Context impl SQLiteImpl. INFO [alembic.migration] Will assume non-transactional DDL. INFO [alembic.autogenerate] Detected added table 'roles' INFO [alembic.autogenerate] Detected added table 'users' INFO [alembic.autogenerate.compare] Detected added index 'ix_users_username' on '['username']' Generating /home/flask/flasky/migrations/versions/1bc 594146bb5_initial_migration.py...done
建議:如果你有克隆在GitHub上的應用程序,你現在可以運行git checkout 5c來切換到這個版本的應用程序。注意,你不需要為這個應用生成migrations,所有的遷移腳本都包含在版本庫中。
6. 更新數據庫
一旦遷移腳本被審查且接受,就可以使用db upgrade命令更新到數據庫中:
(venv) $ python hello.py db upgrade
INFO [alembic.migration] Context impl SQLiteImpl. INFO [alembic.migration] Will assume non-transactional DDL. INFO [alembic.migration] Running upgrade None -> 1bc594146bb5, initial migration
第一次遷移實際上相當于調用db.create_all(),但在后續遷移中,upgrade命令對表實施更新操作但不影響表中的內容。
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com