Flask框架從入門到精通之模型遷移操作(十六)

〆 小源。發表於2019-04-30

知識點: 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中有了物件模型類遷移的擴充套件,維護起來表結構,方便了很多。

歡迎關注我的公眾號:

image

相關文章