在flask中使用flask-migrate管理數據庫

Flask-Migrate是一個爲Flask應用處理SQLAlchemy數據庫遷移的擴展,使得能夠經過Flask的命令行接口或者Flask-Scripts對數據庫進行操做。html

安裝

pip3 install Flask-Migratepython

例子: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這個數據庫存在。sql

 

使用flask命令運行上面的代碼須要先設置環境變量FLASK_APPshell

export FLASK_APP=test.py #註釋:注意等號兩邊不能有空格數據庫

windows:     set FLASK_APP=manage.pyflask

經常使用命令

初始化

flask db initubuntu

這個命令將會新建一個名字爲migrations的文件夾,而且記錄一個數據庫版本號,一份保留在migrations中,一份保存在數據庫中(新建一張名字爲alembic_version的表來保存),值得注意大是新建了migrations文件夾後須要對數據庫模型進行修改,而後使用flask-migrations進行遷移,這樣才產生第一個版本號。
 windows

遷移

flask db migrateapp

遷移腳本最好仔細審查而且按需編寫,由於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數據庫,能夠下載相關可視化工具,查看數據庫中的版本號。

相關文章
相關標籤/搜索