跳至主要内容

故障排除

本指南介绍了如何在开发环境中解决 Prisma Migrate 的问题,这通常涉及重置数据库。有关面向生产的故障排除,请参阅

警告

本指南**不适用于 MongoDB**。
对于 MongoDB,使用 db push 而不是 migrate dev

处理迁移历史冲突

当**文件系统中的 migrations 文件夹**和**数据库中的_prisma_migrations表**之间存在差异时,就会发生迁移历史冲突。

开发环境中迁移历史冲突的原因

  • 已应用的迁移随后被修改
  • 已应用的迁移在文件系统中丢失

在开发环境中,在特性分支之间切换可能会导致历史冲突,因为_prisma_migrations表包含来自branch-1的迁移,而切换到branch-2可能会导致其中一些迁移消失。

注意:您应该绝不故意删除或编辑已应用的迁移,因为这可能会导致开发和生产环境之间出现差异。

在开发环境中修复迁移历史冲突

如果 Prisma Migrate 在您运行 prisma migrate dev 时检测到迁移历史冲突,CLI 将要求重置数据库并重新应用迁移历史。

模式漂移

当您的数据库模式与您的迁移历史记录不同步时,就会发生数据库模式漂移 - 数据库模式已“偏离”真相来源。

开发环境中模式漂移的原因

模式漂移可能发生在以下情况下

  • 数据库模式已使用迁移进行更改 - 例如,通过使用 prisma db push 或手动更改数据库模式。

注意影子数据库 是检测模式漂移所必需的,因此只能在开发环境中执行。

在开发环境中修复模式漂移

如果您对数据库进行了不想保留的手动更改,或者可以在 Prisma 模式中轻松复制

  1. 重置您的数据库

    npx prisma migrate reset
  2. 在 Prisma 模式中复制更改并生成新的迁移

    npx prisma migrate dev

如果您对数据库进行了想要保留的手动更改,您可以

  1. 内省数据库

    npx prisma db pull

    Prisma 将使用直接在数据库中进行的更改更新您的模式。

  2. 生成新的迁移以将内省的更改包含在您的迁移历史记录中

    npx prisma migrate dev --name introspected_change

    Prisma Migrate 将提示您重置,然后应用所有现有迁移以及基于内省更改的新迁移。您的数据库和迁移历史记录现在已同步,包括您的手动更改。

迁移失败

开发环境中迁移失败的原因

如果出现以下情况,迁移可能会失败

  • 在运行迁移之前修改了迁移并引入了语法错误
  • 您向已包含数据的表添加了必填 (NOT NULL) 列
  • 迁移过程意外停止
  • 数据库在迁移过程中关闭

_prisma_migrations表中的每个迁移都有一个logs列,用于存储错误。

在开发环境中修复迁移失败

处理开发人员环境中迁移失败的最简单方法是解决根本原因并重置数据库。例如

  • 如果您通过手动编辑数据库引入了 SQL 语法错误,请更新失败的migration.sql文件并重置数据库

    prisma migrate reset
  • 如果您在 Prisma 模式中引入了无法应用于包含数据的数据库的更改(例如,包含数据的表中的必填列)

    1. 删除migration.sql文件。

    2. 修改模式 - 例如,向必填字段添加默认值。

    3. 迁移

      prisma migrate dev

      Prisma Migrate 将提示您重置数据库并重新应用所有迁移。

  • 如果某些操作中断了迁移过程,请重置数据库

    prisma migrate reset

Prisma Migrate 和 PgBouncer

如果您尝试在使用 PgBouncer 进行连接池的环境中运行 Prisma Migrate 命令,可能会看到以下错误

Error: undefined: Database error
Error querying the database: db error: ERROR: prepared statement "s0" already exists

有关更多信息和解决方法,请参阅 Prisma Migrate 和 PgBouncer 解决方法