SQLALchemy 資料庫遷移

2021-10-25 22:20:22 字數 2756 閱讀 5925

在開發過程中,需要修改資料庫模型,而且還要在修改之後更新資料庫。最直接的方式就是刪除舊表,但這樣會丟失資料。

更好的解決辦法是使用資料庫遷移框架,它可以追蹤資料庫模式的變化,然後把變動應用到資料庫中。

在flask中可以使用flask-migrate擴充套件,來實現資料遷移。並且整合到flask-script中,所有操作通過命令就能完成。

為了匯出資料庫遷移命令,flask-migrate提供了乙個migratecommand類,可以附加到flask-script的manager物件上。

首先要在虛擬環境中安裝flask-migrate。

pip install flask-migrate
flask-migrate的配置

#coding=utf-8

from flask import flask

from flask_sqlalchemy import sqlalchemy

from flask_migrate import migrate,migratecommand

from flask_script import shell,manager

'sqlalchemy_database_uri']=

'mysql:'

'sqlalchemy_commit_on_teardown']=

true

'sqlalchemy_track_modifications']=

true

#第乙個引數是flask的例項,第二個引數是sqlalchemy資料庫例項

#manager是flask-script的例項,這條語句在flask-script中新增乙個db命令

manager.add_command(

'db'

,migratecommand)

#定義模型role

class

role

(db.model)

:# 定義表名

__tablename__ =

'roles'

# 定義列物件

id= db.column(db.integer, primary_key=

true

) name = db.column(db.string(64)

, unique=

true

)def

__repr__

(self)

:return

'role:'

.format

(self.name)

#定義使用者

class

user

(db.model)

: __tablename__ =

'users'

id= db.column(db.integer, primary_key=

true

) username = db.column(db.string(64)

, unique=

true

, index=

true

)def

__repr__

(self)

:return

'user:'

.format

(self.username)

if __name__ ==

'__main__'

: manager.run(

)

建立遷移倉庫
#這個命令會建立migrations資料夾,所有遷移檔案都放在裡面。

建立遷移指令碼 自動建立遷移指令碼有兩個函式,upgrade()函式把遷移中的改動應用到資料庫中。downgrade()函式則將改動刪除。自動建立的遷移指令碼會根據模型定義和資料庫當前狀態的差異,生成upgrade()和downgrade()函式的內容。對比不一定完全正確,有可能會遺漏一些細節,需要進行檢查.

#建立自動遷移指令碼 -m 後面是注釋

python database.py db migrate -m 'initial migration'

這樣之後會在migrations資料夾裡的versions資料夾裡建立乙個版本的py檔案

更新資料庫

使用upgrade函式將上一步建立的遷移指令碼裡的改變更新到資料庫,這一步完成後資料庫才會改變。

python database.py db upgrade
檢視歷史版本 每一次建立遷移指令碼後會自動生成乙個版本號,以後回退版本是需要,使用history命令可以檢視歷史版本號。
python database.py db history
回退資料庫 回退資料庫時,需要指定回退版本號,由於版本號是隨機字串,為避免出錯,建議先使用python database.py db history命令檢視歷史版本的具體版本號,然後複製具體版本號執行回退。 ``` python database.py db downgrade 版本號 ```

SQLalchemy連線資料庫

1 連線命令from sqlalchemy import create engine from sqlite3 import dbapi2 as sqlite engine create engine mysql mysqldb username password hostname 3306 dat...

Flask 資料庫SQLAlchemy 基礎講解

資料庫分為關係型資料庫和泛指型資料庫,典型的關係型資料庫sql有oracle sqlserver mysql等,泛指型資料庫nosql又分為用於儲存實時訊息的文件型資料庫mongodb coachdb和用於儲存快取的鍵值對型資料庫redis riak.安裝sqlalchemy外掛程式 pip ins...

資料庫遷移

這期專案,需要將另外乙個系統a與現有系統b整合,由於時間比較緊,直接採用遷移oracle資料庫物件的方式,發現之前評估的方案不是特別完善,首先 1 a資料庫為gbk編碼,b資料庫是utf 8編碼格式,a資料遷移需要進行中文字段擴容 至少1.5倍 2 a資料庫需要做效能評估,歷史資料遷移涉的方式,兼顧...