天天看點

在flask中使用flask-migrate管理資料庫

Flask-Migrate是一個為Flask應用處理SQLAlchemy資料庫遷移的擴充,使得可以通過Flask的指令行接口或者Flask-Scripts對資料庫進行操作。

安裝

pip3 install Flask-Migrate
           

例子:test.py

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

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

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

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

上述代碼指定資料庫為lrh.db,如果不存在将建立;我們建立了User模型,指定它對應的在資料庫中的名字為users,注意此時表還沒有在建立。資料庫需要指定,此代碼也沒有建立資料庫app.db,如果URI中指定的資料庫原先不存在,則沒有app.db這個資料庫存在。

使用flask指令運作上面的代碼需要先設定環境變量FLASK_APP

常用指令

初始化

flask db init
           

這個指令将會建立一個名字為migrations的檔案夾,并且記錄一個資料庫版本号,一份保留在migrations中,一份儲存在資料庫中(建立一張名字為alembic_version的表來儲存),值得注意大是建立了migrations檔案夾後需要對資料庫模型進行修改,然後使用flask-migrations進行遷移,這樣才産生第一個版本号。

遷移

flask db migrate
           

遷移腳本最好仔細審查并且按需編寫,因為Alembic(flask-migrate的核心)不會檢測模型所有大變化,可以參考這個連結,檢視Alembic的限制。如果不修改将使用預設政策遷移。

更新
flask db upgrade
           

每次資料庫模型變化,需要重複使用migrate指令和upgrade指令(按順序組合使用),使用成功後将修改版本号。

幫助

使用這個指令檢視更多指令。

使用flask-script和flask-migrate

之前的例子沒有額外建立資料庫,不便于學習,這裡使用flask-script管理資料庫創立,此外flask-migrate也支援flask-script的指令行接口,是以可以用flask-script統一管理。

#-*- coding:utf-8 -*-
#filename: manage.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_script import Manager, Shell
from flask_migrate import Migrate, MigrateCommand

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

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


manager = Manager(app)
manager.add_command('db', MigrateCommand)

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

def make_shell_context():
    return dict(app=app, db=db, User=User)

manager.add_command("shell", Shell(make_context=make_shell_context))


if __name__ == '__main__':
    manager.run()
           

(1)flask-migrate提供了一個ManagerCommand類,可以附加在flask-script的Manager類執行個體上。

(2)使用add_command()添加一個shell指令,并且将db,app,User加入上下文中。使用shell指令将進入python shell狀态,由于将db加入了上下文,可以使用shell手動建立資料庫,使用python代碼:

ubuntu指令行狀态下:python3 manage.py shell
進入python shell:
>>>db.create_all()                 #注釋:如果資料庫不存在,将建立資料庫
           

使用flask-script管理資料後,指令如下:

python3 manage.py db init
python3 manage.py db migrate
python3 mange.py db upgrade
python3 mange.py db --help
           

在你使用上述指令後(建立了資料庫),和第一個例子一樣,将在資料庫和本地儲存資料庫版本号。本文使用的是sqlite資料庫,可以下載下傳相關可視化工具,檢視資料庫中的版本号。

使用flask-migrate遇到的問題:點選連結

有關flask-script的部落格:點選連結

flask-migrate的文檔:點選連結

歡迎提出問題,共同進步。