知識點: 1、模型遷移
一、概況
在Django框架開發過程中,我們對資料庫欄位新增或刪除,直接修改模型類,然後進行遷移可以了,非常方便。我們也想讓Flask框架支援這樣的操作,就需要使用Flask-Migrate擴充套件,來實現資料遷移。並且整合到Flask-Script中,所有操作通過命令就能完成。
二、安裝
為了匯出資料庫遷移命令,Flask-Migrate提供了一個MigrateCommand類,可以附加到flask-script的manager物件上。 先安裝下面兩個擴充套件:
pip install Flask-Script
複製程式碼
pip install flask-migrate
複製程式碼
三、配置
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import pymysql
from flask_migrate import Migrate, MigrateCommand
from flask_script import Manager
pymysql.install_as_MySQLdb()
app = Flask(__name__)
# 通過指令碼管理flask程式
manager = Manager(app)
# 設定連線資料庫的URL
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:123456@127.0.0.1:3306/db_flask'
# 設定每次請求結束後會自動提交資料庫中的改動
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
# 資料庫和模型類同步修改
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
# 查詢時會顯示原始SQL語句
app.config['SQLALCHEMY_ECHO'] = True
db = SQLAlchemy(app)
# 建立資料庫遷移物件
Migrate(app, db)
# 向腳步管理新增資料庫遷移命令 db指命令的別名
manager.add_command('db', MigrateCommand)
# 型別
class Type(db.Model):
# 表名
__tablename__ = 'tbl_types'
# 資料庫真正存在的欄位
id = db.Column(db.Integer, primary_key=True) # 主鍵
name = db.Column(db.String(32), unique=True) # 名字
# 資料庫中不存在的欄位,只是為了查詢和反向查詢。
# backref:在關係的另一模型中新增反向引用
heros = db.relationship("Hero", backref='type')
def __repr__(self):
return self.name
# 英雄
class Hero(db.Model):
# 表名
__tablename__ = 'tbl_heros'
# 資料庫真正存在的欄位
id = db.Column(db.Integer, primary_key=True) # 主鍵
name = db.Column(db.String(64), unique=True) # 名字
gender = db.Column(db.String(64)) # 性別
# 外來鍵 一個射手對應很多英雄
type_id = db.Column(db.Integer, db.ForeignKey("tbl_types.id"))
def __repr__(self):
return self.name
if __name__ == '__main__':
# 0.0.0.0代表任何能代表這臺機器的地址都可以訪問
# app.run(host='0.0.0.0', port=5000) # 執行程式
manager.run()
複製程式碼
四、新增欄位
首先我們通過命令建立出migrations資料夾,後面所有的遷移檔案都會放在這個資料夾裡面
python flask_migrate_db.py db init
複製程式碼
如圖所示:
- 生成遷移檔案
下面這條命令跟我們Django裡面的makemigrations一樣,是生成遷移檔案的作用。因為我們的模型類並沒有新增或刪除欄位,所有第一次會出現沒有改變的提示。 -m:給遷移檔案加上註釋
python flask_migrate_db.py db migrate -m 'first create'
複製程式碼
提示:
INFO [alembic.runtime.migration] Context impl MySQLImpl.
INFO [alembic.runtime.migration] Will assume non-transactional DDL.
INFO [alembic.env] No changes in schema detected.
複製程式碼
- 新增新欄位 我們在英雄裡面新增一個年齡欄位,再遷移一下:
age = db.Column(db.Integer) # 年齡
複製程式碼
遷移
python flask_migrate_db.py db migrate -m 'add age'
複製程式碼
遷移檔案會生成到migrations資料夾中如圖:
生成遷移檔案,這個時候資料庫並沒有改變,我們還要用upgrade命令同步到資料庫中:python flask_migrate_db.py db upgrade
複製程式碼
我們在本地資料庫檢視一下表結構:
age欄位已經新增到資料庫當中了。五、回退
回退資料庫時,需要指定回退版本號,由於版本號是隨機字串,為避免出錯,建議先使用python flask_migrate_db.py db history命令檢視歷史版本的具體版本號,然後複製具體版本號執行回退。
裡面base指的是原始版本。例如我們發現我們剛才新增的欄位並沒有什麼作用,我們就可以回退到原始版本。python flask_migrate_db.py db downgrade base
複製程式碼
我們在本地資料庫檢視一下表結構:
後面如果有很多版本,直接指定版本號就可以。例如:python flask_migrate_db.py db downgrade 4cee71e47df3
複製程式碼
在Flask中有了物件模型類遷移的擴充套件,維護起來表結構,方便了很多。
歡迎關注我的公眾號: