服务端与数据 / 进阶

Prisma 生产迁移:把危险变更拆成可回滚步骤

开发环境的自动迁移不等于生产发布流程。本文使用 expand-contract 分阶段新增字段、回填数据、切换代码并最终收紧约束。

区分开发和生产命令

prisma migrate dev 会创建迁移并可能提示重置数据库,只适合开发环境。生产部署使用 prisma migrate deploy,执行仓库中已审查的迁移文件。不要在生产启动时运行 db push。

迁移 SQL 和应用代码一起进入版本控制;在与生产规模接近的数据副本上估算锁时间;部署任务只运行一次迁移,不让每个应用副本同时执行。

新增必填字段要分阶段

Expand:先增加可空的新列,旧代码仍能运行;部署双写代码,新记录同时写旧列和新列;分批回填历史数据,每批提交并监控锁与复制延迟;切换读取到新列,观察一个完整发布周期;Contract:添加 NOT NULL,停止双写,再删除旧列。

EXAMPLE / 02Prisma
UPDATE users
SET display_name = username
WHERE id > $last_id
  AND id <= $last_id + 5000
  AND display_name IS NULL;

提交前阅读生成的 SQL

ORM 无法知道你的流量窗口和数据量。重点检查 DROP、表重写、长时间锁、唯一索引失败和隐式类型转换。先准备数据库级恢复方案;向下迁移脚本并不总能恢复被删掉的数据。

先运行重复值查询并清理数据,再创建唯一索引。迁移失败后不要直接修改已经在其他环境执行过的历史迁移,应新增修复迁移。