yuetsh
2e871cb5b0
refactor(迁移): 换掉 drizzle 的执行器,一条迁移一个事务
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>
2026-08-26 09:54:01 -06:00
..
2026-08-26 09:54:01 -06:00
2026-08-26 07:56:30 -06:00
2026-08-26 07:56:30 -06:00
2026-08-06 20:45:51 -06:00