PRISMA.IO - 生产数据库迁移时数据被清除问题求助
解决Prisma + SQLite生产环境迁移不丢失数据的问题
我明白你的困扰——Prisma搭配SQLite时用db push清数据确实头疼,尤其是生产环境绝对不能接受这种情况。下面给你梳理下正确的解决思路和步骤:
1. 立刻停止在生产环境使用db push
db push的设计定位是开发阶段快速同步schema,它会直接对比你的Prisma Schema和数据库结构,遇到SQLite不支持的变更(比如修改字段类型、删除字段)时,只能通过重建表的方式同步,这就会导致数据丢失。生产环境绝对不能用这个命令。
2. 改用Prisma Migrate(官方推荐的生产级迁移工具)
这是解决问题的核心,Migrate会生成可追踪的迁移脚本,安全地更新数据库结构,不会清空现有数据:
- 第一步:初始化迁移(如果还没做过)
运行npx prisma migrate dev --name init,这会生成第一个迁移文件,记录当前数据库的初始结构。 - 后续schema变更:
每次修改完Prisma Schema后,运行npx prisma migrate dev,Prisma会自动生成新的迁移文件,你可以查看这些文件确认变更逻辑,确保没有破坏性操作。 - 生产环境部署:
发布时运行npx prisma migrate deploy,这个命令会检查并执行所有未应用到生产数据库的迁移脚本,安全完成结构更新,全程不会丢失数据。
3. 应对SQLite的局限性
SQLite本身对ALTER TABLE支持有限(比如不能直接修改字段类型、重命名字段),遇到这类变更时,Prisma Migrate会自动创建一个"影子数据库"模拟变更过程,生成安全的迁移脚本(比如先创建新表、迁移数据、删除旧表、重命名新表)。如果对自动生成的脚本有疑问,你可以手动编辑迁移文件,但一定要仔细核对,避免数据丢失。
4. 生产环境必备:数据备份
即使使用Migrate,操作前备份数据也是必须的,SQLite的备份非常简单:
- 直接复制你的SQLite数据库文件(比如
prisma/prod.db)到备份目录即可。 - 可以写个简单的bash脚本自动备份:
#!/bin/bash BACKUP_DIR="./prod-backups" mkdir -p $BACKUP_DIR cp ./prisma/prod.db $BACKUP_DIR/prod-$(date +%Y%m%d%H%M%S).db
执行迁移前运行这个脚本,确保数据有兜底保障。
总结
不需要复杂的数据导出脚本,只要切换到Prisma Migrate作为生产环境的迁移工具,配合简单的备份操作,就能安全完成数据库结构变更且不丢失数据。记住:db push只适合开发初期快速试错,生产环境一定要用Migrate。
内容的提问来源于stack exchange,提问作者mokamars
相关产品推荐
相关产品推荐

