一不小心真删库了

事情经过

就是今天看到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.jsTypeScript 项目中更轻松地处理数据库操作.

Prisma db

db操作pullpushseedexecute,这一系列命令用于将 Prisma schema 中的定义同步到数据库 schema 中。db push 会检查当前数据库并根据您的 Prisma schema 对其进行更改。这是一种直接将 Prisma schema 变更应用到数据库的方法,但不会创建或使用迁移文件。在使用 db类操作 时,不会记录更改的历史(也就是不会生成提交记录,记住这一点很重要)、而我理解迁移历史的意义就是在于回滚、备份、恢复和版本控制,因此适用于原型设计和开发过程中的快速迭代

它的工作流分解一下可以分为以下几步:

  1. 自检Prisma 工具检查当前连接的数据库,并收集有关现有表、列、索引和其他数据库对象的详细信息。
  2. 分析Prisma 分析收集到的数据库信息,并尝试推断当前数据库结构与 Prisma schema 之间的差异。结合推断出的信息,Prisma 将生成相应的数据库操作(例如创建、修改或删除表、列、索引等),执行后,当前已连接的数据库结构和 本地Prisma schema 应该保持一致。
  3. 生成触发器 :默认情况下,在将更改应用到数据库架构后,Prisma 会触发生成器(例如,Prisma Client)。不需要手动调用 prisma generate

Prisma migrate

它帮助我们根据 Prisma schema 中的更改自动创建、处理和执行迁移,同时保持数据库 schema 与迁移历史记录同步。migrate dev 通过影子数据库(shadow database)来检测 schema 偏移和冲突,并在需要时提示我们进行数据库重置。也就是说它可以确保在团队中正确地记录和同步数据库更改。

它的工作流分解一下可以分为以下几步:

  1. 重播现有迁移历史 :在影子数据库(shadow database)中重播现有迁移历史,以便检测 schema 偏移(编辑或删除的迁移文件,或者对数据库 schema 的手动更改)。
  2. 应用待执行的迁移:将待执行的迁移应用到影子数据库(例如,由同事创建的新迁移)。
  3. 从 Prisma schema 更改中生成新迁移 :在运行 migrate dev 命令之前,从我们对 Prisma schema 所做的任何更改中生成新迁移。
  4. 将所有未应用的迁移应用到开发数据库并更新 _prisma_migrations :将所有未应用的迁移应用到开发数据库,并更新 _prisma_migrations 表以记录已执行的迁移。
  5. 生成触发器和迁移历史

Why?

刚刚提到了做db操作是不会生成提交记录的,那到底发生了什么呐,我旁边的老大哥给我复盘了一下,首先A同事对数据库进行了db push操作(因为他正在设计一张表),这时候数据库schema其实已经偏移了但这时候,我并不知道因为没有任何的留存,然后接下来我在没有进行db pull的情况下直接去做了migrate操作,其实在这个时候prisma通过生成的影子数据库已经检测到了有偏移了,但我并没有注意,直接y到底,导致直接进行了reset操作清空了数据。

反思

  • 在团队协作项目中优先使用数据库迁移工具(如 migrate dev)。
  • 在执行关键数据库操作之前,确保同步所有的更改并了解同事所做的修改。
  • 当迁移工具检测到偏移和冲突时,确保花时间了解问题并采取适当措施。
  • 这其实就是缺乏适当沟通和不遵循较好实践带来的后果。在执行关键操作前了解同事的更改和确认是非常重要的。遇到迁移工具检测到的偏移和冲突时,应确保彻底了解问题并采取适当措施解决,而不是忽略警告。
相关推荐
小白学习日记34 分钟前
【复习】HTML常用标签<table>
前端·html
john_hjy38 分钟前
11. 异步编程
运维·服务器·javascript
风清扬_jd1 小时前
Chromium 中JavaScript Fetch API接口c++代码实现(二)
javascript·c++·chrome
丁总学Java1 小时前
微信小程序-npm支持-如何使用npm包
前端·微信小程序·npm·node.js
姜学迁1 小时前
Rust-枚举
开发语言·后端·rust
yanlele1 小时前
前瞻 - 盘点 ES2025 已经定稿的语法规范
前端·javascript·代码规范
It'sMyGo1 小时前
Javascript数组研究09_Array.prototype[Symbol.unscopables]
开发语言·javascript·原型模式
爱学习的小健1 小时前
MQTT--Java整合EMQX
后端
懒羊羊大王呀1 小时前
CSS——属性值计算
前端·css
北极小狐2 小时前
Java vs JavaScript:类型系统的艺术 - 从 Object 到 any,从静态到动态
后端