數(shù)據(jù)庫變更和升級的問題
開發(fā)過程中,雖然絕大多數(shù)的項(xiàng)目開發(fā)之前都會(huì)完成數(shù)據(jù)庫的表結(jié)構(gòu)進(jìn)行設(shè)計(jì)饮亏。但是隨著一些需求的深入和業(yè)務(wù)的探索温眉,不可避免的會(huì)出現(xiàn)數(shù)據(jù)模型需要被修改的問題。
flask中珍手,我們會(huì)使用一些ORM框架來解決我們的問題。例如前面提及的flask-sqlalchemy辞做,是對flask應(yīng)用增加sqlachemy支持的擴(kuò)展插件琳要。
創(chuàng)建了各種數(shù)據(jù)模型在應(yīng)用之中,怎么去更好的記錄數(shù)據(jù)庫結(jié)構(gòu)的變化和怎么實(shí)現(xiàn)數(shù)據(jù)庫修改的前后滾動(dòng)呢秤茅?大神們已經(jīng)給我們準(zhǔn)備好了好道具:Alembic稚补。
Alembic為我們提供了好的數(shù)據(jù)庫修改記錄和升降級的功能。實(shí)現(xiàn)了一個(gè)類似GIT一樣的功能框喳。
而在flask中也有相應(yīng)的擴(kuò)展插件:flask-migrate
-
安裝flask-migrate
pip install flask-migrate
-
應(yīng)用部署
修改應(yīng)用中的相關(guān)文件课幕。
datatube/datatube/model/user.pyfrom datatube import db class User(db.Model): __tablename__ = 'con_user' id = db.Column(db.INTEGER, primary_key=True) name = db.Column(db.String(30)) secretkey = db.Column(db.String(100)) status = db.Column(db.Boolean) def __init__(self, name, status): self.name = name self.status = status def __repr__(self): return 'User %r,Status % r' % (self.name, self.status)
datatube/datatube/__init__.py
from flask import Flask from flask_migrate import Migrate, MigrateCommand from flask_script import Manager from flask_sqlalchemy import SQLAlchemy from datatube.config import DevConfig # 初始化應(yīng)用 app = Flask(__name__) # 從config中加載配置文件內(nèi)容 config上線模式 devConfig開發(fā)模式 app.config.from_object(DevConfig) # 初始化數(shù)據(jù)庫 db = SQLAlchemy(app) # 初始化migrate migrate = Migrate(app, db) # 初始化manager manager = Manager(app) # command加載DB命令,可以使用migrate manager.add_command('db', MigrateCommand) from datatube.interface import demo
-
使用flask-migrate來更新升級
進(jìn)入cmd,進(jìn)入環(huán)境:
python manage.py db init
這時(shí)候我們可以看到應(yīng)用目錄先生成了一個(gè)migrations文件夾
再輸入
python manage.py db migrate -m "init"
migrations文件件中的versions多出了一個(gè)py文件:
versions里面的這個(gè)文件就是剛才migrate操作后生成的文件五垮,里面包含了此次對數(shù)據(jù)庫變更的記錄乍惊。
再輸入
python manage.py db upgrade
upgrade語句將自動(dòng)讀取剛才生成的文件,將數(shù)據(jù)庫結(jié)構(gòu)更新到數(shù)據(jù)庫中放仗。多處修改一次完成润绎,不需要在手動(dòng)去數(shù)據(jù)庫用SQL一句句操作。
-
對數(shù)據(jù)庫的回滾
# 獲取 History ID python manage.py db history # 回滾到某個(gè) history python manage.py db downgrade <history_id>
用以上的操作回滾到歷史上的一個(gè)數(shù)據(jù)庫版本。用法和GIT類似莉撇,依舊十分方便呢蛤。
以上就是使用flask-migrate來管理數(shù)據(jù)庫結(jié)構(gòu)變更的方法了。