知識點: 一、模型遷移python
在Django框架開發過程當中,咱們對數據庫字段添加或刪除,直接修改模型類,而後進行遷移能夠了,很是方便。咱們也想讓Flask框架支持這樣的操做,就須要使用Flask-Migrate擴展,來實現數據遷移。而且集成到Flask-Script中,全部操做經過命令就能完成。mysql
爲了導出數據庫遷移命令,Flask-Migrate提供了一個MigrateCommand類,能夠附加到flask-script的manager對象上。 先安裝下面兩個擴展:sql
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
複製代碼
如圖所示: flask
下面這條命令跟咱們Django裏面的makemigrations同樣,是生成遷移文件的做用。由於咱們的模型類並無添加或刪除字段,全部第一次會出現沒有改變的提示。 -m:給遷移文件加上註釋bash
python flask_migrate_db.py db migrate -m 'first create'
複製代碼
提示:app
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文件夾中如圖: spa
生成遷移文件,這個時候數據庫並無改變,咱們還要用upgrade命令同步到數據庫中:python flask_migrate_db.py db upgrade
複製代碼
咱們在本地數據庫查看一下表結構: code
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中有了對象模型類遷移的擴展,維護起來表結構,方便了不少。
歡迎關注個人公衆號: