1、簡介及安裝
- 在實際開發中經常存在後期進行資料庫修改行為,一般我們修改資料庫不會手動修改,而是修改ORM對應的模型,然後把資料庫模型映射到資料庫中。
- 之前的方法
方法隻在第一次運作時會執行,在後期再次修改資料庫的字段時,不會再自動的映射到資料庫中,必須删除表,然後重新運作db.creat_all()
才能生效,重新進行映射。這不符合我們的需求。db.creat_all()
- 是以
就是解決這個問題的。flask-migrate
是基于flask-migrate
進行的一個封裝,并內建到Flask中,而所有的遷移操作其實都是Alembic
Alembic
做的,他能跟蹤模型的變化,并将變化映射到資料庫中
使用
需要安裝,指令如下:(首先需要激活本項目的虛拟環境)flask-migrate
pip install flask-migrate
使用
flask_migrate
必須借助
flask_scripts
,這個包的
MigrateCommand
中包含了所有和資料庫相關的指令。
2、準備工作
- 在新的項目中建立一個
檔案,連接配接資料庫驅動。config.py
- 建立一個
檔案:exts.py
# exts.py
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
- 建立一個
檔案:models.py
# models.py
from exts import db
# 建立映射表
class Article(db.Model): #模型必須繼承db.Model
#db.Column映射到表中字段,primary_key主鍵,autoincrement自增,nullable可為空(預設為True)
__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)
- 主app檔案
flaskmigrate.py
# flaskmigrate.py
from flask import Flask
from exts import db
import config
from models import Article
app = Flask(__name__)
app.config.from_object(config)
db.init_app(app)
@app.route('/')
def index():
return 'hello Python'
if __name__=='__main__':
app.run(debug=True)
-
檔案:manager.py
# manager.py
from flask_script import Manager
from flaskmigrate import app
from flask_migrate import Migrate,MigrateCommand
from exts import db
from models import Article
manager = Manager(app)
# 1.要使用flask_migrate,必須綁定app和db
migrate = Migrate(app,db)
# 2.把MigrateCommand指令添加到manager中
manager.add_command('db',MigrateCommand)
if __name__ == '__main__':
manager.run()
注意: 一定不要忘記在
flaskmigrate.py
檔案中導入
Article
資料表模型類,
3、運作
調試需要在終端指令行進行。
在調試前,可以先觀察下,在該項目中不存在
migrations
這個檔案夾
下面開始運作
flask_migrate
相關的指令:(依次運作下面的三條指令)
-
初始化一個遷移腳本的環境,隻需要執行一次,執行完該條魚具後,我們可以觀察到在該項目下被建立了一個python manage.py db init
檔案夾,但是migrations
檔案夾下是空的。migrations/versions
-
将模型生成遷移檔案,該條語句執行完後,會發現該項目下的python manage.py db migrate
檔案夾内有檔案了。在後期如果對模型進行了修改,就需要再執行一次這個指令。migrations/versions
-
最後添加将映射檔案真正的映射到資料庫中。此時檢視資料庫的中被建立了python manage.py db upgrade
這個表,且表中有已定義的幾個字段。在後期如果對模型進行了修改,就需要執行完上一個指令後,再執行一次這個指令。article
注意: 在後期如果對模型進行了修改,就需要再一遍上面的第2-3條指令。,第一條指令無需再運作。
舉例:
如果我們對
models.py
檔案中的
Article
類進行了修改,比如添加了一個字段
tags
,如下:
# models.py
from exts import db
# 建立映射表
class Article(db.Model): #模型必須繼承db.Model
#db.Column映射到表中字段,primary_key主鍵,autoincrement自增,nullable可為空(預設為True)
__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)
則隻需再在終端執行
python manage.py db migrate
和
python manage.py db upgrade
這兩條指令就可實作對
article
這個表的修改,即被添加了
tags
這個字段。
以上筆記整理自知了課堂黃勇老師講解的教學視訊《Flask架構入門到實戰開發》的第三章第12小節内容,不足之處,望不吝賜教!