本文給大家分享的是 Flask 數據庫遷移詳情,db.create_all()不會重新創建表或是更新表,需要先使用db.drop_all()刪除數據庫中所有的表之後再調用db.create_all()才能重新創建表,但是這樣的話,原來表中的數據就都被刪除了,這肯定是不行的,這時就出現了數據庫遷移的概念 |
db.create_all()不會重新創建表或是更新表,需要先使用db.drop_all()刪除數據庫中所有的表之後再調用db.create_all()才能重新創建表,但是這樣的話,原來表中的數據就都被刪除了,這肯定是不行的,這時就出現了數據庫遷移的概念。
在開發過程中,隨着需求的變化,有可能需要添加或修改表的一些字段,但是原表中的數據不能刪除,此時就需要創建新表,並將舊錶中的數據遷移至新表中,Flask-Migrate這個擴展就可以在不破壞數據的情況下更新數據庫表的結構,並完成數據從舊錶到新表的遷移。
可以使用pip install flask-migrate進行安裝。在程序中,我們實例化 Flask_Migrate 提供的 Migrate 類,進行初始化操作。
from flask_migrate import Migrate from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) ··· db = SQLAlchemy(app) migrate = Migrate(app, db)
實例化 Migrate 類,需要傳入 Flask 實例 app 和 SQLAlchemy創建的實例 db。
先定義 User 模型類。
class User(db.Model): __tablename__ = 'user' id = db.Column(db.Integer, primary_key=True) user_name = db.Column(db.String) password = db.Column(db.String)
在開始遷移數據之前,需要先使用下面的命令創建一個遷移環境:
flask db init
遷移環境只需創建一次,創建後會在項目根目錄下生成一個 migrations 目錄,其中包含了自動生成的配置文件和遷移版本目錄。
flask db migrate -m "create_table"
-m 選項添加備註信息,執行後遷移版本目錄生成了遷移腳本。
遷移腳本內有兩個函數:
upgrade():把遷移中的改動應用到數據庫中
downgrade():將改動撤銷
自動生成的遷移腳本會根據模型定義和數據庫當前狀態的差異,生成upgrade()和downgrade()函數的內容,不一定完全正確,有必要再進行檢查一下。
生成了遷移腳本後,使用flask db upgrade命令可完成對數據庫的更新。執行後即可生成數據庫及表。
如果之後我們需要改動 user 表中的字段,比如添加一個mobile字段,我們只需在 User 模型類中添加該屬性,之後執行flask db migrate -m '註釋'和flask db upgrade命令即可。
class User(db.Model): __tablename__ = 'user' id = db.Column(db.Integer, primary_key=True) user_name = db.Column(db.String) password = db.Column(db.String) mobile = db.Column(db.String)
如果想要回滾遷移的話,可以執行flask db downgrade命令。
這裏只是介紹如何在 Flask 中進行數據庫遷移,關於在生產環境下,是否需要使用遷移工具或者使用何種工具進行遷移,這裏不做討論,至於我的話,在生產環境中,我沒有使用過Flask-Migrate,而是選擇編寫 SQL 腳本來處理數據庫及表的更新或改動,我覺得這樣更不容易出錯,其實各有各的好處,看自己選擇。