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

知識點: 一、模型遷移python

1、概況

在Django框架開發過程當中,咱們對數據庫字段添加或刪除,直接修改模型類,而後進行遷移能夠了,很是方便。咱們也想讓Flask框架支持這樣的操做,就須要使用Flask-Migrate擴展,來實現數據遷移。而且集成到Flask-Script中,全部操做經過命令就能完成。mysql

2、安裝

爲了導出數據庫遷移命令,Flask-Migrate提供了一個MigrateCommand類,能夠附加到flask-script的manager對象上。 先安裝下面兩個擴展:sql

pip install Flask-Script
複製代碼
pip install flask-migrate
複製代碼

3、配置

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()

複製代碼

4、添加字段

首先咱們經過命令建立出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字段已經添加到數據庫當中了。

5、回退

回退數據庫時,須要指定回退版本號,因爲版本號是隨機字符串,爲避免出錯,建議先使用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
相關文章
相關標籤/搜索