生产环境下Prisma Schema迁移如何避免数据丢失?
Prisma 开发到生产的数据库迁移工作流程解答
关于prisma migrate deploy的行为判断
你的理解完全正确:默认情况下,prisma migrate deploy碰到会导致数据丢失的破坏性Schema变更(比如删字段、删表、修改字段类型导致数据截断)时,会直接终止并报错,不会强行执行变更——这是Prisma内置的安全机制,就是为了防止生产数据意外丢失。
你的流程评价与优化建议
你梳理的这套流程已经非常贴近生产级的最佳实践,核心思路是提前规避风险、手动把控迁移脚本,最大程度保护数据,这里补充几个实际工作中常用的优化点:
现有流程的合理性
- 步骤1用
db push快速迭代且拒绝数据丢失:db push默认遇到破坏性变更也会报错(除非加--force),这个设置能确保你在本地开发时不会误删数据,从源头避免后续迁移脚本带隐患,逻辑没问题。 - 步骤2用
migrate dev --create-only生成基础脚本:这一步能拿到Prisma自动生成的初始迁移代码,比从零写高效得多,还能避免语法错误,是正确的做法。 - 步骤3手动调整脚本规避数据丢失:比如删字段前先把数据迁到临时表、改字段类型前先做数据兼容转换,这是生产迁移的核心操作,必须坚持。
- 步骤4本地用
migrate dev验证:确保调整后的脚本能在本地正常跑,且无数据丢失,相当于前置测试,没问题。 - 步骤5生产用
migrate deploy:这是Prisma官方推荐的生产部署方式,它会严格按版本控制的迁移脚本执行,还自带安全校验,完全没问题。
可优化的细节
- 加预生产环境验证:如果团队有条件,生产部署前一定要在和生产环境数据结构、数据量一致的预生产环境跑一遍
migrate deploy——本地测试可能没覆盖到大数据量下的性能问题,预生产能提前踩坑。 - 迁移脚本纳入代码评审:把迁移脚本和业务代码一样,加入代码评审流程,让同事一起检查有没有遗漏的数据迁移逻辑,或者性能瓶颈(比如大表加索引没加
CONCURRENTLY)。 - 迁移前必做备份:不管脚本测试多少次,生产迁移前一定要做数据库全量备份,这是最后一道防线,出问题能快速回滚。
db push的使用场景:db push适合单人快速迭代的开发阶段,但多人协作时,建议优先用migrate dev生成迁移脚本并提交版本控制,避免多人Schema冲突,db push可以作为临时测试的补充。
关于“需要删除数据的迁移不应纳入版本控制”的疑问
这个观点不完全对:
- 如果是误操作的破坏性迁移(比如手滑删了字段),当然不能提交到版本控制,直接丢弃重新生成脚本就行。
- 但如果是业务需求明确的必要数据清理(比如某个字段不再使用,需要归档后删除),对应的迁移脚本(比如先迁数据到归档表,再删字段)必须纳入版本控制——这是团队协作和生产部署的必要步骤,所有人都需要同步这个变更。
- 注意:哪怕是业务需求的删除操作,也绝对不能直接写
DROP COLUMN或DROP TABLE,必须先完成数据迁移/归档,再执行删除,这类脚本可以入版本控制,但一定要经过严格评审和测试。
额外实战经验
- 涉及大表的迁移(比如千万级数据的表加字段、改类型),别一次性执行:先加字段/临时表,再后台异步迁移数据,最后切换业务逻辑并删除旧字段,避免锁表影响生产业务。
- 复杂的数据迁移可以用Prisma的交互式事务(
interactiveTransactions预览特性),确保迁移操作的原子性,要么全成要么全回滚。 - 生产执行
migrate deploy时,一定要保存完整的执行日志,出问题时能快速排查。
内容的提问来源于stack exchange,提问作者TruMan1
相关产品推荐
相关产品推荐

