Prisma,我只是更新一下表结构,你为什么要重置我的数据库!?

1,701 阅读2分钟

场景

开发过程中需要对原有的服务器后台的数据库部分进行prisma的重构,并且添加一张新表,因此需要保证数据库中的数据完美迁移到prisma

过程

1. 根据数据库生成Schema定义

image.png 终端执行:

pnpm prisma db pull

执行结果:

image.png 根据数据库生成了对应的Schema

2. 新增一张表或者修改表结构执行迁移命令

image.png 执行迁移命令

pnpm prisma migrate dev

得到prisma警告,从提示可以看出,数据库的schema与迁移历史不一致,需要重置整个数据库,所有的数据都将丢失。 image.png

3. 分析问题

首先需要知道prisma做出需要重置数据库的判断的根据是什么,显然通过prisma db pull 生成的schema是和数据库的结构一致的,因此问题不在这里。 问题出在了migration history上,我们可以从官方文档上找到答案。

image.png 从第四点可以看出,prisma migrate dev是通过_prisma_migrations表中的数据来判断是否需要重置数据表的。

知道了这一点,解决方法就有了。

4. 解决问题

找到了问题的原因,只需要手动创建一条迁移历史就可以解决这个问题。

  1. 在prisma目录下创建migrations/initial/migration.sql文件。 image.png
  2. 通过mysql图形化工具,将创建表结构的sql语句导入到这个文件中(我这里用的是mtysql官方的工具workbench) image.png image.png
  3. 通过prisma migrate resolve命令应用这条记录,使其生效(其实就是将他存到_prisma_migrations表中)
pnpm prisma migrate resolve --applied initial

image.png image.png

  1. 这个时候,我们在执行迁移命令prisma migrate dev就可以实现完美迁移了(--skip-generate是为了演示的时候跳过生成prisma/client的过程,正常情况下不需要加) image.png

再次踩坑与官方解决方案

按照上面描述的方法确实能够解决第一次的迁移,但是如果在这个基础上再次改动schema执行迁移命令人仍然会报错。 在多次查看了官方文档之后,找到了原因,migration历史储存migration.sql文件的文件夹名称十分讲究,必须是数字+下划线+名称的方式,才能保证后续的迁移操作不会受到影响。这里记录一下,大家可以注意一下这点,下面贴上官方的解决方案(大致和上面的步骤差不多,但是不需要我们自己导出数据库结构,而是通过cli进行操作)

image.png

相关官方文档地址:www.prisma.io/docs/orm/pr…