场景
开发过程中需要对原有的服务器后台的数据库部分进行prisma的重构,并且添加一张新表,因此需要保证数据库中的数据完美迁移到prisma
过程
1. 根据数据库生成Schema定义
终端执行:
pnpm prisma db pull
执行结果:
根据数据库生成了对应的Schema
2. 新增一张表或者修改表结构执行迁移命令
执行迁移命令
pnpm prisma migrate dev
得到prisma警告,从提示可以看出,数据库的schema与迁移历史不一致,需要重置整个数据库,所有的数据都将丢失。
3. 分析问题
首先需要知道prisma做出需要重置数据库的判断的根据是什么,显然通过prisma db pull
生成的schema是和数据库的结构一致的,因此问题不在这里。
问题出在了migration history
上,我们可以从官方文档上找到答案。
从第四点可以看出,prisma migrate dev
是通过_prisma_migrations
表中的数据来判断是否需要重置数据表的。
知道了这一点,解决方法就有了。
4. 解决问题
找到了问题的原因,只需要手动创建一条迁移历史就可以解决这个问题。
- 在prisma目录下创建
migrations/initial/migration.sql
文件。 - 通过mysql图形化工具,将创建表结构的sql语句导入到这个文件中(我这里用的是mtysql官方的工具workbench)
- 通过
prisma migrate resolve
命令应用这条记录,使其生效(其实就是将他存到_prisma_migrations
表中)
pnpm prisma migrate resolve --applied initial
-
这个时候,我们在执行迁移命令
prisma migrate dev
就可以实现完美迁移了(--skip-generate
是为了演示的时候跳过生成prisma/client
的过程,正常情况下不需要加)
再次踩坑与官方解决方案
按照上面描述的方法确实能够解决第一次的迁移,但是如果在这个基础上再次改动schema执行迁移命令人仍然会报错。
在多次查看了官方文档之后,找到了原因,migration
历史储存migration.sql
文件的文件夹名称十分讲究,必须是数字+下划线+名称的方式,才能保证后续的迁移操作不会受到影响。这里记录一下,大家可以注意一下这点,下面贴上官方的解决方案(大致和上面的步骤差不多,但是不需要我们自己导出数据库结构,而是通过cli进行操作)
相关官方文档地址:www.prisma.io/docs/orm/pr…