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的文檔:點選連結
歡迎提出問題,共同進步。