cgwire作為開源軟體,目前還處於快速更新迭代的階段。github上面的程式碼倉庫顯示,12月3號還merge了一個PR。所以如果之前使用了老版本的zou(這個是cgwire的後臺服務),那麼你如果想拉取並使用最新的程式碼的話,你就要實現資料的平滑遷移了。幸運的是,cgwire也考慮了資料遷移的問題,並提供了相應的方法。下面我給大家詳細演示下如何操作。
cgwire資料庫遷移技術實現:
資料庫:
postgres
ORM框架:
SQLAlchemy
遷移的解決方案是基於flask migrate
場景:
在遷移開始之前我們當前的狀態是:
首先使用的是比較低的一個版本的zou
而且資料庫中已經有業務資料了
我們對cgwire做了一些定製開發,修改過資料庫的表結構。
遷移步驟
備份已有資料庫(好習慣要養成)
進入postgres資料庫的容器,執行下面的命令,備份postgres資料庫
pg_dumpall -U postgres > backup_file
2。進入postgres容器,然後執行下面的命令
1。執行
psql -U
進入postgres命令列
2。
\c zoudb
切換資料庫到zoudb
2。
delete from alembic_version
將alembic_version表清空
原因:因為我們之前修改過資料庫,每次修改alembic_version裡面就會相應記錄修改的版本。如果alembic_version裡面的版本沒有和migrations檔案下的匹配,就會報錯。
3。執行
zou stamp-db
原因:將資料庫的修改版本設定成當前migrations中的最新的修改號,否則在進行zou migrate-db的時候會報相應的錯誤。
4。zou migrate-db 生成遷移指令碼
5。修改指令碼 ,新增列舉型別STATUSES和VALIDATION_STATUSES,然後修改相應的字端
vi /opt/zou/env/lib/python3。8/site-packages/zou/migrations/versions/0e8c575b2151_。py
STATUSES = [ (“processing”, “Processing”), (“ready”, “Ready”), (“broken”, “Broken”),]VALIDATION_STATUSES = [ (“validated”, “Validated”), (“rejected”, “Rejected”), (“neutral”, “Neutral”),]
6。儲存退出,執行zou upgrade-db,完成結構遷移。
總結:
這種遷移方法,還有個漏洞就是,如果新的程式碼裡面增加了字端,這些字端有是有新的邏輯生成的。而我們老的資料裡面沒有這些資料,就需要我們瞭解改動,並透過sql或是指令碼與程式進行backfill了。今天就到這裡,謝謝觀看