1. 背景說(shuō)明:
通過(guò)SQLAlchemy來(lái)創(chuàng)建表的時(shí)候,采用的是db.create_all()方法(該方法只能使用一次),這種方法有一個(gè)非常嚴(yán)重的問(wèn)題,就是當(dāng)我們需要添加或者刪除數(shù)據(jù)庫(kù)表中的字段的時(shí)候,直接修改Models里面的類(lèi)是沒(méi)有用的,必須要把數(shù)據(jù)庫(kù)刪除了,然后重新執(zhí)行db.create_all()方法,才會(huì)把我們修改的內(nèi)容映射到數(shù)據(jù)庫(kù)中,這在項(xiàng)目上線之后,數(shù)據(jù)庫(kù)中已經(jīng)存在數(shù)據(jù)了,如果要更新數(shù)據(jù)庫(kù)了,這種方法是萬(wàn)萬(wàn)不可采用的,不可能把數(shù)據(jù)庫(kù)刪了,在重新新建,這時(shí)候就需要對(duì)數(shù)據(jù)庫(kù)進(jìn)行遷移,該遷移類(lèi)似于Django框架中的遷移。flask_migrate可以通過(guò)命令把修改后的模型直接映射到數(shù)據(jù)庫(kù)中而不用刪除數(shù)據(jù)庫(kù)。
2. 安裝包 flask-migrate
pip install flask-migrate
3. 記錄下代碼
3.1 新建config.py文件,該文件用來(lái)寫(xiě)入相關(guān)配置,下面我們配置數(shù)據(jù)庫(kù)相關(guān)
DIALECT = 'mysql' # 要用的什么數(shù)據(jù)庫(kù)
DRIVER = 'pymysql' # 連接數(shù)據(jù)庫(kù)驅(qū)動(dòng)
USERNAME = 'root' # 用戶(hù)名
PASSWORD = '123456' # 密碼
HOST = 'localhost' # 服務(wù)器
PORT = '3307' # 端口
DATABASE = 'migrate_test' # 數(shù)據(jù)庫(kù)名
SQLALCHEMY_DATABASE_URI = "{}+{}://{}:{}@{}:{}/{}?charset=utf8".format(DIALECT, DRIVER, USERNAME, PASSWORD, HOST, PORT,
DATABASE)
SQLALCHEMY_TRACK_MODIFICATIONS = False
3.2 在models中新建模型Article
先將SQLAlchemy實(shí)例化對(duì)象,此處為了不出現(xiàn)導(dǎo)包循環(huán),我們單獨(dú)將對(duì)象實(shí)例化寫(xiě)道exts.py中,如下:
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
獲得db實(shí)例化對(duì)象,開(kāi)始進(jìn)行模型創(chuàng)建
from exts import db
class Article(db.Model):
__tablename__ = 'article'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
title = db.Column(db.String(100), nullable=False)
content = db.Column(db.Text, nullable=False)
tags = db.Column(db.String(100), nullable=False)
category = db.Column(db.String(10))
img = db.Column(db.String(200))
3.3 為了清楚的表示MVC模式,MTV模式,此處我們將路由部分放在了views.py中
代碼如下:
from flask import Blueprint
blue = Blueprint('test', __name__)
@blue.route('/')
def hello():
return 'hello flask'
3.4 重點(diǎn):manage.py文件
代碼如下:
from flask import Flask
from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand
from config import SQLALCHEMY_DATABASE_URI, SQLALCHEMY_TRACK_MODIFICATIONS
from exts import db
from views import blue
# 在進(jìn)行遷移時(shí),必須導(dǎo)入模型,不然數(shù)據(jù)庫(kù)不會(huì)改變
from models import Article
app = Flask(__name__)
app.register_blueprint(blueprint=blue, url_prefix='/app')
app.config['SQLALCHEMY_DATABASE_URI'] = SQLALCHEMY_DATABASE_URI
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = SQLALCHEMY_TRACK_MODIFICATIONS
db.init_app(app)
manager = Manager(app)
# init migrate upgrade
# 模型 -> 遷移文件 -> 表
# 1.要使用flask_migrate,必須綁定app和DB
migrate = Migrate(app, db)
# 2.把migrateCommand命令添加到manager中。
manager.add_command('db', MigrateCommand)
if __name__ == '__main__':
manager.run()
第一次進(jìn)行遷移時(shí):
python manage.py db init # 初始化遷移文件,系統(tǒng)默認(rèn)生成migrate文件夾
python manage.py db migrate # 檢查模型字段是否修改,如果改變,就產(chǎn)生新的遷移文件.
python manage.py db upgrade # 對(duì)遷移文件進(jìn)行遷移
后面遷移:(只需要進(jìn)行如下兩步驟):
python manage.py db migrate # 檢查模型字段是否修改,如果改變,就產(chǎn)生新的遷移文件.
python manage.py db upgrade # 對(duì)遷移文件進(jìn)行遷移