migrations/ 中應用於 @insforge/cli 的版本化 SQL 檔案。每次成功執行都記錄在 system.custom_migrations 中。工作流程是僅向前的。
概念
遷移是一個帶有 14 位數 UTC 時間戳前綴的 SQL 檔案:<YYYYMMDDHHmmss>_<name>.sql。CLI 在交易內按順序應用待處理檔案,將 search_path 設定為 public,並僅在成功時記錄歷史。PostgREST 自動重新載入架構中繼資料。檔案內的 BEGIN/COMMIT/ROLLBACK 被拒絕。
用法
連結後端,然後建立檔案。up <version> 針對單個檔案,或使用 up --to <version> 應用到目標為止的所有待處理項。
特定用法案例
在現有專案上採用遷移:首先執行db migrations fetch 來將遠端歷史具體化為本機檔案。一旦應用於遠端,永遠不要就地編輯遷移。改為編寫前向遷移。
選擇加入後,透過檔案路由所有架構變更。臨時儀表板編輯會在 git 和 system.custom_migrations 之間造成漂移。
非交易性陳述式
由於 CLI 會把每個遷移檔案放在單個交易內執行(這也是BEGIN/COMMIT/ROLLBACK 被拒絕的原因),少數無法在交易區塊內執行的 PostgreSQL 命令會在遷移中失敗,並回報類似 CREATE INDEX CONCURRENTLY cannot run inside a transaction block 的錯誤。常見的有:
CREATE INDEX CONCURRENTLY— 若可接受短暫的寫入鎖定,就在遷移中使用一般的CREATE INDEX;或在遷移之外執行並行建置(見下文)。VACUUM— 例行 vacuum 由 PostgreSQL autovacuum 處理,您很少需要自己執行。REINDEX ... CONCURRENTLY、ALTER TYPE ... ADD VALUE(在較舊的 PostgreSQL 上)等類似命令。
npx @insforge/cli db query(不帶 --unrestricted)會把陳述式包在交易裡,因此會遇到同樣的錯誤——對於非交易性命令請使用 --unrestricted。
兩種
db query 路徑都會強制套用 30 秒的 statement_timeout,因此在大型資料表上執行 CREATE INDEX CONCURRENTLY 或 VACUUM 可能會逾時。更多資源
- Database branching 在副本上排練遷移。
- Database overview 瞭解 PostgREST 如何拾取架構變更。
- PostgreSQL DDL docs 用於您編寫的 SQL。