修改Prisma schema后如何对非空数据库执行无数据丢失迁移
Prisma存量数据场景下的无丢失迁移方案
以下是经过验证的可落地方案,全程不会覆盖现有存量数据:
1. 首次接入Prisma迁移的基线配置
如果你的数据库已经跑了很久有存量数据,第一次用Prisma迁移需要先做基线对齐,避免后续迁移触发全表重建:
- 先执行
prisma db pull,把当前数据库的真实结构同步到你的Prisma Schema文件中,确保两边完全一致 - 执行
prisma migrate dev --name init --create-only,这个命令只会生成初始迁移的SQL文件,不会直接执行修改数据库 - 打开
prisma/migrations目录下刚生成的0000_init文件夹,清空里面的SQL文件内容 - 执行
prisma migrate resolve --applied 0000_init,标记这个基线迁移已经在当前库执行过,后续迁移会从这个版本之后开始计算
2. 后续修改Schema的安全迁移流程
每次修改完Prisma Schema需要做迁移时,按以下步骤操作:
- 执行
prisma migrate dev --name [自定义迁移标识名] --create-only,不要直接省略--create-only参数,该参数会让Prisma只生成SQL文件,不会自动执行,你可以先检查SQL内容是否符合预期 - 如果Prisma自动生成的SQL包含
DROP TABLE、DROP COLUMN这类你不想要的破坏性操作,可以手动修改SQL文件,比如修改字段名的场景,把默认的删旧字段加新字段逻辑,改成ALTER TABLE 表名 RENAME COLUMN 旧字段名 TO 新字段名,避免数据丢失 - 新增非空字段时,建议先把字段设为可选(加
?标识),执行迁移补完全量存量数据后,再把字段改成非空,避免非空约束校验不通过导致迁移失败 - 确认SQL没有问题后,执行
prisma migrate dev应用迁移即可
生产环境迁移注意事项
- 生产环境禁止使用
prisma migrate dev,该命令是开发环境专用,存在触发数据库重置的风险,生产环境请使用prisma migrate deploy执行迁移 - 任何迁移操作前,务必先做全量数据库备份,避免意外
- 大表变更请先在测试环境验证执行耗时,避免锁表影响线上业务
内容的提问来源于stack exchange,提问作者Mohamed Fadel Moumeni
相关产品推荐
相关产品推荐

