在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(128))
上述程式碼指定資料庫為lrh.db,如果不存在將新建;我們建立了User模型,指定它對應的在資料庫中的名字為users,注意此時表還沒有在建立。資料庫需要指定,此程式碼也沒有新建資料庫app.db,如果URI中指定的資料庫原先不存在,則沒有app.db這個資料庫存在。
使用flask命令執行上面的程式碼需要先設定環境變數FLASK_APP
export FLASK_APP=test.py #註釋:注意等號兩邊不能有空格
windows: set FLASK_APP=manage.py
常用命令
初始化
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(128))
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資料庫,可以下載相關視覺化工具,檢視資料庫中的版本號。