Python的Flask架構中使用Flask-Migrate擴充遷移資料庫的教程

來源:互聯網
上載者:User
我們在升級系統的時候,經常碰到需要補救伺服器端資料結構等操作,之前的方式是通過手工編寫alter sql指令碼處理,經常會發現遺漏,導致程式發布到伺服器上後無法正常使用。

現在我們可以使用Flask-Migrate外掛程式來解決之,Flask-Migrate外掛程式是基於Alembic,Alembic是由大名鼎鼎的SQLAlchemy作者開發資料移轉工具。

具體操作如下:

1. 安裝Flask-Migrate外掛程式

$ pip install Flask-Migrate

2. 修改Flask App部分的代碼,以增加Migrate相關的Command

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命令對錶實施更新操作但不影響表中的內容。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.