Skip to main content
迁移是 migrations/ 中应用于 @insforge/cli 的版本化 SQL 文件。每次成功运行都记录在 system.custom_migrations 中。工作流是仅向前的。

概念

迁移是一个带有 14 位数 UTC 时间戳前缀的 SQL 文件:<YYYYMMDDHHmmss>_<name>.sql。CLI 在事务内按顺序应用待处理文件,将 search_path 设置为 public,并仅在成功时记录历史。PostgREST 自动重新加载架构元数据。文件内的 BEGIN/COMMIT/ROLLBACK 被拒绝。

用法

链接后端,然后创建文件。
编写 SQL。
应用待处理的迁移并检查历史。
使用 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 上)等类似命令。
请使用 CLI 的 unrestricted 原始 SQL 路径在迁移之外运行这些命令,它会执行语句而不将其包裹在事务中:
普通的 npx @insforge/cli db query(不带 --unrestricted)会把语句包裹在事务里,因此会遇到同样的错误——对于非事务性命令请使用 --unrestricted。
两种 db query 路径都强制执行 30 秒的 statement_timeout,因此在大表上运行 CREATE INDEX CONCURRENTLY 或 VACUUM 可能会超时。

更多资源