目錄
db.create_all()不會重新建立表或是更新表,需要先使用db.drop_all()刪除資料庫中所有的表之後再呼叫db.create_all()才能重新建立表,但是這樣的話,原來表中的資料就都被刪除了,這肯定是不行的,這時就出現了資料庫遷移的概念。
在開發過程中,隨著需求的變化,有可能需要新增或修改表的一些字段,但是原表中的資料不能刪除,此時就需要建立新錶,並將舊表中的資料遷移至新錶中,flask-migrate這個擴充套件就可以在不破壞資料的情況下更新資料庫表的結構,並完成資料從舊表到新錶的遷移。
可以使用pip install flask-migrate進行安裝。在程式中,我們實www.cppcns.com例化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.swioua**btring)
password = db.column(db.string)
2.1.1 建立遷移環境
在開始遷移資料之前,需要先使用下面的命令建立乙個遷移環境:
flask db init
遷移環境只需建立一次,建立後會在專案根目錄下生成乙個migrations目錄,其中包含了自動生成的配置檔案和遷移版本目錄。
2.1.2 生成遷移指令碼
使用如下命令自動生成遷移指令碼:
flask db migrate -m "create_table"
-m 選項新增備註資訊,執行後遷移版本目錄生成了遷移指令碼。
遷移指令碼內有兩個函式:
自動生成的遷移指令碼會根據模型定義和資料庫當前狀態的差異,生成upgrade()和downgrade()函式的內容,不一定完全正確,有必要再進行檢查一下。
2.1.3 更新資料庫
生成了遷移指令碼後,使用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 www.cppcns.com指令碼來處理資料庫及表的更新或改動,我覺得這樣更不容易出錯,其實各有各的好處,看自己選擇。
Flask資料庫遷移
在開發過程中,需要修改資料庫模型,且還要在修改之後更新資料庫。最直接的 式就是刪除 舊表,但這樣會丟失資料。更好的解決辦法是使 資料庫遷移框架,它可以追蹤資料庫模式的變化,然後把變動應 到資料 庫中。在flask中可以使 flask migrate擴充套件,來實現資料遷移。並且整合到flask sc...
flask資料庫遷移
1.pip3 install flask script 安裝專案管理包 flask script 2.pip3 install flask migrate 安裝資料遷移包 flask migrate 1.匯入包 from flask script import manager from flask ...
flask 資料庫遷移
安裝flask migrate pip install flask migratepython manager.py db init 自動建立遷移指令碼有兩個函式 upgrade 函式把遷移中的改動應用到資料庫中。downgrade 函式則將改動刪除。python manager.py db mig...