pgroll是一種開源命令行工具,通過同時提供多個模式版本,為PostgreSQL提供安全且可逆的模式遷移。它需要照顧複雜的遷移操作,以確保在更新數據庫架構時客戶應用程序繼續工作。這包括確保在不鎖定數據庫的情況下應用更改,並且新架構版本同時起作用(即使進行斷裂更改也可以進行!)。這消除了與模式遷移相關的風險,並大大簡化了客戶端應用程序的推出,還允許即時回滾。
有關pgroll解決的問題,請參見介紹性博客文章。
pgroll通過在物理表頂部使用視圖來創建虛擬模式來創建虛擬模式。這允許執行遷移所需的所有必要更改,而不會影響現有客戶。

pgroll遵循擴展/合同工作流程。在遷移開始時,它將在物理模式中執行所有加法更改(創建表,添加列等),而不會破壞它。
當列在列上需要打破變化時,它將在物理模式中創建一個新列,並從舊列中回填。另外,配置觸發器以確保在整個主動遷移期間都將所有寫入舊/新列都會傳播到其對應物。然後,新列將在新版本的架構中公開。
一旦開始階段完成,就可以準備好新的架構版本,將所有視圖映射到適當的表格和列。然後,客戶端應用程序可以訪問新的模式版本,而舊版本仍然可用。這是開始推出客戶應用程序的新版本的時刻。

如果沒有更多的客戶端應用程序使用舊模式版本,則可以完成遷移。這將刪除舊模式,而新模式將是唯一可用的模式。將不再需要刪除所需的表和列(目前沒有客戶使用此列表),並且新的名稱將重命名為最終名稱。在此階段,客戶端應用程序仍在工作,因為視圖仍在映射到適當的表和列。
二進製文件可用於Linux,MacOS和Windows,檢查我們的版本。
要從源安裝pgroll ,請運行以下命令:
go install github.com/xataio/pgroll@latest注意:需要1.23或更高版本。
要與Homebrew一起安裝pgroll ,請運行以下命令:
# macOS or Linux
brew tap xataio/pgroll
brew install pgroll請按照以下步驟使用pgroll執行您的第一個模式遷移:
pgroll需要在數據庫中存儲一些內部狀態。創建表可跟踪當前的模式版本和存儲版本歷史記錄。要準備數據庫,請運行以下命令:
pgroll init --postgres-url postgres://user:password@host:port/dbname創建一個遷移文件。您可以檢查示例文件夾以獲取一些示例。例如,使用此遷移文件創建一個新customers表:
{
"name" : " initial_migration " ,
"operations" : [
{
"create_table" : {
"name" : " customers " ,
"columns" : [
{
"name" : " id " ,
"type" : " integer " ,
"pk" : true
},
{
"name" : " name " ,
"type" : " varchar(255) " ,
"unique" : true
},
{
"name" : " bio " ,
"type" : " text " ,
"nullable" : true
}
]
}
}
]
}然後運行以下命令開始遷移:
pgroll --postgres-url postgres://user:password@host:port/dbname start initial_migration.json這將在數據庫中創建一個新的模式版本,並應用遷移操作(創建表)。完成此命令後,舊版本的架構(沒有客戶表)和新版本(帶有客戶表)都可以同時訪問。
啟動遷移後,客戶端應用程序可以開始使用新的模式版本。為了這樣做,需要將它們配置為訪問它。可以通過將search_path設置為新的架構版本名稱(由pgroll start輸出提供)來完成:例如:
SET search_path TO ' public_initial_migration ' ;一旦使用舊架構版本沒有更多的客戶端應用程序,就可以完成遷移。這將刪除舊模式。要完成遷移,請運行以下命令:
pgroll --postgres-url postgres://user:password@host:port/dbname complete在遷移期間的任何時候,都可以回到上一個版本。這將刪除新的模式,並像遷移開始之前一樣將舊模式留下來。要回滾遷移,請運行以下命令:
pgroll --postgres-url postgres://user:password@host:port/dbname rollback有關更高級的用法,教程和詳細選項,請參閱文檔中的指南和參考。
每項提交main都會運行一些性能基準,以便隨著時間的推移跟踪性能。每個基準測試都對Postgres 14.8、15.3、16.4、17.0和“最新”。圖表上的每一行代表基準的行數,目前為10k,100k和300k行。
Backfill:行以價值placeholder的文本列進行回填。我們使用每批10K行的默認批處理策略,而沒有退縮。WriteAmplification/NoTrigger:基線行/s在沒有pgroll觸發的情況下將數據寫入表。pgroll觸發器時,將數據寫入表時WriteAmplification/WithTrigger:行/s。ReadSchema:檢查read_schema函數的每秒執行次數,該函數是在遷移過程中經常執行的核心函數。他們可以在這裡看到。
我們歡迎社區的捐款!如果您想為pgroll做出貢獻,請遵循以下準則:
對於這個項目,我們承諾採取行動和互動,以有助於開放,熱情,多樣,包容和健康的社區。
這是有助於靈感的項目和文章的列表,或者與pgroll相似:
該項目已根據Apache許可證2.0的許可 - 有關詳細信息,請參見許可證文件。
如果您有任何疑問,遇到問題或需要幫助,請在此存儲庫中打開一個問題,我們加入我們的不和諧,我們的社區將很樂意提供幫助。
由Xata用❤️製成?