You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Prisma无Schema变更时仍自动生成重复迁移问题求助

Prisma迁移重复生成status列变更的问题解决建议

问题场景

我的Prisma Schema相关部分如下:

enum ApprovalStatus {
  APPROVED
  DENIED
  PENDING
}

model Attendee {
  user      User           @relation(fields: [user_id], references: [id])
  user_id   BigInt
  event     Event          @relation(fields: [event_id], references: [id])
  event_id  BigInt
  status    ApprovalStatus @default(APPROVED)
  created_at DateTime      @default(now())
  updated_at DateTime?     @updatedAt
  deleted_at DateTime?

  @@id([user_id, event_id])
  @@unique([user_id, event_id])
  @@map("attendees")
}

首次执行npx prisma migrate dev后,已成功在PostgreSQL中创建对应表和枚举类型,但后续每次执行该命令(无论是否添加--create-only参数),哪怕Schema无任何变更、之前的迁移已正确应用,都会生成如下重复迁移:

/*
  Warnings:

  - The `status` column on the `attendees` table would be dropped and recreated. This will lead to data loss if there is data in the column.

*/
-- AlterTable
ALTER TABLE "attendees" DROP COLUMN "status",
ADD COLUMN     "status" "ApprovalStatus" NOT NULL DEFAULT 'APPROVED';

环境信息

  • prisma: ^4.6.0
  • express: ^4.17.2
  • typescript: ^4.8.4
  • psql: 15.0(服务器版本12.13 (Debian 12.13-1.pgdg110+1))

解决建议

  • 升级Prisma版本:当前使用的4.6.0版本存在与PostgreSQL枚举类型识别相关的已知bug,建议升级至4.x系列的后期稳定版本或5.x版本,这类版本修复了不少数据库枚举与Schema同步的问题。
  • 校验迁移文件与数据库一致性:
    1. 找到首次创建ApprovalStatus枚举和attendees表的迁移文件,确认其中已正确创建枚举并将status列绑定到该枚举类型。
    2. 直接删除后续生成的重复迁移文件,手动修改prisma/migrations/migration_lock.toml,确保锁定的迁移记录为已正确应用的版本,避免Prisma误判需要再次变更。
  • 检查数据库枚举定义:
    使用psql连接数据库,执行\d ApprovalStatus查看枚举的实际定义,确认枚举值的大小写、名称与Schema完全一致(PostgreSQL枚举大小写敏感,若数据库中枚举值与Schema存在大小写差异,会导致Prisma持续认为需要变更);同时执行\d attendees确认status列的类型确实为ApprovalStatus。
  • 清理Prisma缓存:
    删除node_modules/.prisma/client目录,然后运行npx prisma generate重新生成客户端,确保Prisma基于最新的Schema和数据库状态同步信息。

内容的提问来源于stack exchange,提问作者vedran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 09:05:23