1. 程式人生 > >在flask中使用flask-migrate管理資料庫

在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資料庫,可以下載相關視覺化工具,檢視資料庫中的版本號。