事情经过
就是今天看到web
前端的页面因为某个字段是Null
,就想给Prisma
的某个字段加上一个默认值,就像这样:
感觉也比较常规,当我改完这个字段后,我想的就是直接跑prisma migrate
然后去迁移数据库,然后自动把null
全部填值了。
md,然后因为我觉得这个操作好像再正常不过了
,所以我就没看prisma
在说啥,直接一路y
到底了。
然后我一看prisma
的客户端,茫然
->刷几下
->看看链接
->茫然
->再刷几下
->啊?
->无语凝噎
->亚历山大、血压升高、心跳加速
。md我的数据那,我的表里怎么一条数据没了,几万条啊?????
所以这个事情就告诉了我们,在做一些操作的时候不要觉得烦就一路y到底,认真看看命令行的反馈,那tm红红的一段 All data will be lost.......
问题追溯
在问题追溯前我先简单介绍下Prisma
是啥,以及db
操作和migrate
操作(就是如果完全不了解数据库
和Orm
的已经可以直接跳过了)。
Prisma
简单的说就是Prisma
通过自己创建的特定语言DSL,把自己DSL
结构映射为表结构
,然后可以通过一系列cli
去生成client
或者迁移洗数据推拉数据库
之类的操作,去帮助开发者在 Node.js
和 TypeScript
项目中更轻松地处理数据库操作.
Prisma db
db操作
有pull
、push
、seed
、execute
,这一系列命令用于将 Prisma schema
中的定义同步到数据库 schema
中。db push
会检查当前数据库并根据您的 Prisma schema
对其进行更改。这是一种直接将 Prisma schema
变更应用到数据库的方法,但不会创建或使用迁移文件。在使用 db类操作
时,不会记录更改的历史(也就是不会生成提交记录,记住这一点很重要
)、而我理解迁移历史的意义就是在于回滚、备份、恢复和版本控制
,因此适用于原型设计和开发过程
中的快速迭代
。
它的工作流分解一下可以分为以下几步:
- 自检 :
Prisma
工具检查当前连接的数据库,并收集有关现有表、列、索引和其他数据库对象的详细信息。 - 分析 :
Prisma
分析收集到的数据库信息,并尝试推断当前数据库结构与Prisma schema
之间的差异。结合推断出的信息,Prisma
将生成相应的数据库操作(例如创建、修改或删除表、列、索引等),执行后,当前已连接的数据库结构和 本地Prisma schema
应该保持一致。 - 生成触发器 :默认情况下,在将更改应用到数据库架构后,Prisma 会触发生成器(例如,Prisma Client)。不需要手动调用
prisma generate
。
Prisma migrate
它帮助我们根据 Prisma schema
中的更改自动创建、处理和执行迁移,同时保持数据库 schema
与迁移历史记录同步。migrate dev
通过影子数据库(shadow database
)来检测 schema
偏移和冲突,并在需要时提示我们进行数据库重置
。也就是说它可以确保在团队中正确地记录和同步数据库更改。
它的工作流分解一下可以分为以下几步:
- 重播现有迁移历史 :在影子数据库(
shadow database
)中重播现有迁移历史,以便检测schema
偏移(编辑或删除的迁移文件,或者对数据库 schema 的手动更改)。 - 应用待执行的迁移:将待执行的迁移应用到影子数据库(例如,由同事创建的新迁移)。
- 从 Prisma schema 更改中生成新迁移 :在运行
migrate dev
命令之前,从我们对Prisma schema
所做的任何更改中生成新迁移。 - 将所有未应用的迁移应用到开发数据库并更新
_prisma_migrations
表 :将所有未应用的迁移应用到开发数据库,并更新_prisma_migrations
表以记录已执行的迁移。 - 生成触发器和迁移历史
Why?
刚刚提到了做db
操作是不会生成提交记录的,那到底发生了什么呐,我旁边的老大哥给我复盘了一下,首先A同事
对数据库进行了db push
操作(因为他正在设计一张表),这时候数据库
的schema
其实已经偏移了
但这时候,我并不知道因为没有任何的留存
,然后接下来我在没有进行db pull
的情况下直接去做了migrate
操作,其实在这个时候prisma
通过生成的影子数据库
已经检测到了有偏移了
,但我并没有注意,直接y
到底,导致直接进行了reset
操作清空了数据。
反思
- 在团队协作项目中优先使用数据库迁移工具(如
migrate dev
)。 - 在执行关键数据库操作之前,确保同步所有的更改并了解同事所做的修改。
- 当迁移工具检测到偏移和冲突时,确保花时间了解问题并采取适当措施。
- 这其实就是缺乏适当沟通和不遵循较好实践带来的后果。在执行关键操作前了解同事的更改和确认是非常重要的。遇到迁移工具检测到的偏移和冲突时,应确保彻底了解问题并采取适当措施解决,而不是忽略警告。