2e871cb5b02caf1cd7472b52d68c6de34d87782f
drizzle 的 migrate()(pg-core/dialect.js)把所有待执行的迁移塞进同一个 session.transaction(),两个后果:第 3 条失败会把第 1、2 条一起回滚,和 Django migrate 的逐条提交语义不一样;以及 CREATE INDEX CONCURRENTLY 一律跑不了, 没有任何开关。 现在自己按 journal 逐条执行,一条一个事务。文件第一行写 `-- oj2:no-transaction` 的迁移走裸执行(简单查询协议——扩展协议会把语句包进隐式事务块,CONCURRENTLY 照样被拒),代价是没有回滚,所以这类迁移一个文件只放一条语句。 记账行的写法和 drizzle 完全一致(hash = 整文件 sha256,created_at = journal 的 when),migrator 又只比 created_at、不校验 hash,两套执行器可以互换。 顺带:日志和报错说得出迁移文件名了(readMigrationFiles 不返回 tag,自己读一遍 journal),失败时打印的是 Postgres 那句话而不是 postgres.js 的内部堆栈, 新增退出码 5。 实跑验证(本机 Docker,生产 schema 灌进探针库):CONCURRENTLY 带标记成功、 indisvalid = t,去掉标记复现 "cannot run inside a transaction block"; 0003 成功 + 0004 失败时,0003 留下、0004 的首条合法语句没留下。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Description
No description provided
9.5 MiB
Languages
TypeScript
58.4%
Vue
39.2%
Shell
1.5%
Dockerfile
0.8%