1. 背景說明:
通過SQLAlchemy來創(chuàng)建表的時候舀射,采用的是db.create_all()方法(該方法只能使用一次),這種方法有一個非常嚴重的問題驹碍,就是當我們需要添加或者刪除數(shù)據(jù)庫表中的字段的時候壁涎,直接修改Models里面的類是沒有用的,必須要把數(shù)據(jù)庫刪除了志秃,然后重新執(zhí)行db.create_all()方法怔球,才會把我們修改的內(nèi)容映射到數(shù)據(jù)庫中,這在項目上線之后浮还,數(shù)據(jù)庫中已經(jīng)存在數(shù)據(jù)了竟坛,如果要更新數(shù)據(jù)庫了,這種方法是萬萬不可采用的,不可能把數(shù)據(jù)庫刪了担汤,在重新新建又官,這時候就需要對數(shù)據(jù)庫進行遷移,該遷移類似于Django框架中的遷移。flask_migrate可以通過命令把修改后的模型直接映射到數(shù)據(jù)庫中而不用刪除數(shù)據(jù)庫漫试。
2. 安裝包 flask-migrate
pip install flask-migrate
3. 記錄下代碼
3.1 新建config.py文件,該文件用來寫入相關(guān)配置,下面我們配置數(shù)據(jù)庫相關(guān)
DIALECT = 'mysql' # 要用的什么數(shù)據(jù)庫
DRIVER = 'pymysql' # 連接數(shù)據(jù)庫驅(qū)動
USERNAME = 'root' # 用戶名
PASSWORD = '123456' # 密碼
HOST = 'localhost' # 服務(wù)器
PORT = '3307' # 端口
DATABASE = 'migrate_test' # 數(shù)據(jù)庫名
SQLALCHEMY_DATABASE_URI = "{}+{}://{}:{}@{}:{}/{}?charset=utf8".format(DIALECT, DRIVER, USERNAME, PASSWORD, HOST, PORT,
DATABASE)
SQLALCHEMY_TRACK_MODIFICATIONS = False
3.2 在models中新建模型Article
先將SQLAlchemy實例化對象,此處為了不出現(xiàn)導包循環(huán),我們單獨將對象實例化寫道exts.py中,如下:
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
獲得db實例化對象,開始進行模型創(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 重點: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
# 在進行遷移時,必須導入模型,不然數(shù)據(jù)庫不會改變
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()
第一次進行遷移時:
python manage.py db init # 初始化遷移文件,系統(tǒng)默認生成migrate文件夾
python manage.py db migrate # 檢查模型字段是否修改,如果改變,就產(chǎn)生新的遷移文件.
python manage.py db upgrade # 對遷移文件進行遷移
后面遷移:(只需要進行如下兩步驟):
python manage.py db migrate # 檢查模型字段是否修改,如果改變,就產(chǎn)生新的遷移文件.
python manage.py db upgrade # 對遷移文件進行遷移