第十屆鐵人賽 flask-restful DAY26-搞懂Flask-Migrate

Flask-Migrate

在昨日的內容中已經教授大家如何將flask-SQLAlchemy導入到現有的專案,但是若是資料庫尚未初始化或是Model結構有更新時要如何更新資料庫呢,這就是今日要介紹的函式庫Flask-Migrate的功用了。

安裝Flask-Migrate

首先第一件要做的是不外乎就是安裝函式庫,當然看過前面內容的讀者請試試自己是否已經學會如何安裝函式庫了,若不會或是新加入的朋友們請看看以下指令:

$ pip install Flask-Migrate

初始化Flask-Migrate

在安裝完函式庫後就是要將Flask-Migrate設定到專案內,所以這部分先看一下以下的內容:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db'

db = SQLAlchemy(app)
migrate = Migrate(app, db)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(128))

flask_migrate的指令

在設定完後接下來就是要使用flask_migrate的指令來初始化設定檔以及設定資料庫等資訊了,以下分別針對其指令加以說明:

flask db init

這指令會依據Model的結構產生初始化設定並放置於migrations資料夾內。

flask db migrate

透過這指令可以產生資料庫內容,而不用去寫SQL語法建立Table以及設定DB Schema。

flask db upgrade

當Model的結構有異動時要自動更新資料庫的話首先先執行此指令,接下來再執行flask db migrate,如此即可更新資料庫以符合Model資料結構。

整合注意事項

不知道讀者們在執行flask db init是否有遇到下列問題:

    .(以上略)
    directory = current_app.extensions['migrate'].directory
KeyError: 'migrate'

筆者幾經反覆試驗,甚至於使用flask-script來解決,似乎可以用flask-script來解決這問題,但是爬文如是时候从 Flask-Script 迁移到 Flask CLI了說明flask-script已許久沒更新了,所以又再重新檢視哪裡出了問題,最後問題是出在:

if __name__ == '__main__':
    from common.db import db
    from common.ma import ma
    from flask_migrate import Migrate
    db.init_app(app)
    migrate = Migrate(app, db)
    ma.init_app(app)

有讀者看出端倪了嗎?重點在於flask db init執行時雖然會跑app.py,但是沒辦法執行到初始化SQLAlchemy跟Migrate,所以執行flask db init會出現上面的錯誤,這是我在處理flask-migrate所遇到的坑。

小結

今日主要是教授如何透過Flask-Migrate來協調Model與資料庫的差異以及透過指令將資料庫升級以符合Model的資料結構,明日在更進一步教授SQLAlchemy如何處理資料表之間的關聯等進階內容,敬請期待。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *