故障排除
本指南介绍如何在开发环境中解决 Prisma Migrate 问题,这通常涉及重置数据库。有关面向生产的故障排除,请参阅
处理迁移历史冲突
当**文件系统中的迁移文件夹**和**数据库中的_prisma_migrations
表**之间存在差异时,就会发生迁移历史冲突。
开发环境中迁移历史冲突的原因
- 已经应用的迁移后来被修改了
- 已经应用的迁移在文件系统中丢失了
在开发环境中,在功能分支之间切换会导致历史冲突,因为_prisma_migrations
表包含来自branch-1
的迁移,而切换到branch-2
可能会导致其中一些迁移消失。
注意:您应该永远不要故意删除或编辑已应用的迁移,因为这可能会导致开发和生产之间出现差异。
修复开发环境中的迁移历史冲突
如果 Prisma Migrate 在您运行prisma migrate dev
时检测到迁移历史冲突,CLI 将要求重置数据库并重新应用迁移历史。
模式漂移
当数据库模式与您的迁移历史记录不同步时,就会发生数据库模式漂移 - 数据库模式已“偏离”真实来源。
开发环境中模式漂移的原因
模式漂移可能发生在以下情况:
- 数据库模式在不使用迁移的情况下发生了更改 - 例如,通过使用
prisma db push
或手动更改数据库模式。
注意:影子数据库 是检测模式漂移所必需的,因此只能在开发环境中完成。
修复开发环境中的模式漂移
如果您对数据库进行了不想保留的手动更改,或者可以在 Prisma 模式中轻松复制这些更改
-
重置您的数据库
npx prisma migrate reset
-
在 Prisma 模式中复制更改并生成新的迁移
npx prisma migrate dev
如果您对数据库进行了想要保留的手动更改,您可以
-
内省数据库
npx prisma db pull
Prisma 将使用在数据库中直接进行的更改更新您的模式。
-
生成新的迁移以将内省的更改包含在您的迁移历史中
npx prisma migrate dev --name introspected_change
Prisma Migrate 会提示您重置,然后应用所有现有迁移以及基于内省更改的新迁移。您的数据库和迁移历史现在已同步,包括您的手动更改。
迁移失败
开发环境中迁移失败的原因
迁移可能会在以下情况下失败:
- 您在运行迁移之前修改了迁移并引入了语法错误
- 您向已经包含数据的表添加了强制性 (
NOT NULL
) 列 - 迁移过程意外停止
- 数据库在迁移过程的中间关闭了
_prisma_migrations
表中的每个迁移都有一个logs
列,该列存储错误。
修复开发环境中的迁移失败
在开发人员环境中处理迁移失败的最简单方法是解决根本原因并重置数据库。例如
-
如果您通过手动编辑数据库引入了 SQL 语法错误,请更新失败的
migration.sql
文件并重置数据库prisma migrate reset
-
如果您在 Prisma 模式中引入了无法应用于包含数据的数据库的更改(例如,包含数据的表中的强制性列)
-
删除
migration.sql
文件。 -
修改模式 - 例如,为强制性字段添加默认值。
-
迁移
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 解决方法。