【Prisma】如何修复(重建)已经损坏的迁移历史?

当 migrations 历史已经损坏,但是数据库的数据还是完好的,这时简单的方法是删除迁移历史记录,以数据库内容重建迁移历史,也就是以当前数据库的状态重建基线,具体如下。

实际情况是,当你应用 migrate 命令时报错,显示迁移历史记录丢失。

这种情况发生的原因是:你的数据库中存在一个名为 _prisma_migrations 的表,记录了过去所有的迁移历史(那几十个 2025xxxx 的记录),但你本地的 prisma/migrations 文件夹为空。Prisma 发现数据库记录的迁移在本地找不到,因此认为发生了"漂移(Drift)"。

千万不要运行 prisma migrate reset,否则会清空所有数据。

按照以下步骤通过"基线化(Baselining)"来恢复迁移功能:

第一步:清理数据库中的迁移记录

由于你本地的迁移文件已经丢失,且你想重新开始,我们需要让数据库"忘记"之前的迁移历史。

连接到你的数据库(使用 pgAdmin, TablePlus 或命令行),执行以下 SQL:

sql 复制代码
-- 删除所有旧的迁移记录,这样 Prisma 就会认为这是一个新起点
TRUNCATE TABLE _prisma_migrations;

第二步:创建初始迁移文件(基线)

现在我们要根据当前的 schema.prisma 创建一个新的"起始"迁移文件,但不立即执行它(因为表已经在数据库里了)。

  1. 创建迁移文件夹(如果不存在):

    bash 复制代码
    mkdir -p prisma/migrations/0_init
  2. 使用 prisma migrate diff 生成当前 schema 的全量 SQL:

    bash 复制代码
    npx prisma migrate diff \
      --from-empty \
      --to-schema-datamodel prisma/schema.prisma \
      --script > prisma/migrations/0_init/migration.sql

    这一步会把当前的模型定义生成为一个完整的 migration.sql 文件。

第三步:标记该迁移已完成(关键)

我们需要告诉 Prisma:"这个 0_init 迁移已经应用过了,你不需要再往数据库里跑 SQL 了"。

执行以下命令:

bash 复制代码
npx prisma migrate resolve --applied 0_init

第四步:同步并验证

现在你的本地文件(0_init)和数据库记录(_prisma_migrations 表里的一条记录)就同步了。

尝试运行:

bash 复制代码
npx prisma migrate dev

结果预测:

  • 如果你的 schema.prisma 和 数据库结构 完全一致 ,Prisma 会提示 Already in sync
  • 如果你有细微改动,Prisma 会提示你创建一个新的迁移。

常见问题排查

1. 如果执行 migrate resolve 报错找不到文件?

确保目录结构如下:

text 复制代码
prisma/
  schema.prisma
  migrations/
    0_init/
      migration.sql

2. 以后改了 schema 怎么办?

现在迁移功能已经恢复了。以后只需正常运行:

bash 复制代码
npx prisma migrate dev --name add_new_field

3. 为什么不直接用 migrate dev --create-only

因为当数据库中存在 _prisma_migrations 记录而本地没有文件时,Prisma 的安全机制会强制要求 reset。手动清空该表并 resolve 是绕过此机制且保护数据的标准做法。

建议: 修复完成后,务必将新的 migrations 文件夹提交到 Git 仓库,防止再次丢失。

相关推荐
草莓熊Lotso2 小时前
【Redis 初阶】Set 类型深度解析:去重集合的运算能力与实战场景
linux·网络·数据库·windows·redis·tcp/ip·缓存
煎饼皮皮侠3 小时前
【设计】设计一个web版的数据库管理平台后端(之五) --借鉴mybatis
数据库·mybatis
东风破_9 小时前
danci 2:创建的单词书到底存在哪里?从 Supabase 一路理解 ORM、Drizzle 和 RLS
数据库·后端·node.js
橙子家11 小时前
OSS 文件上传的几个风险点和解决方案
数据库
2601_9620664912 小时前
【Sql Server】Update中的From语句,以及常见更新操作方式
android·java·数据库
愤怒的苹果ext13 小时前
MySQL Shell备份恢复数据库
数据库·mysql·备份恢复·mysqlsh
数字新视界15 小时前
DCIM管理系统的技术架构与部署模式详解
数据库·物联网·数据中心·数据中心基础设施管理·dcim管理系统
何以解忧,唯有..15 小时前
Pydantic 介绍与使用:Python 数据校验的现代方案
数据库·python·microsoft
这个DBA有点耶16 小时前
数据库容灾进入“秒级时代”:同城双活架构原理、关键技术选型与落地实践
数据库·架构·dba
2601_9620748117 小时前
大数据-264 实时数仓 - Canal MySQL的binlog研究 存储目录 变动信息 配置MySQL
大数据·数据库·mysql