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同步的问题。
- 校验迁移文件与数据库一致性:
- 找到首次创建
ApprovalStatus枚举和attendees表的迁移文件,确认其中已正确创建枚举并将status列绑定到该枚举类型。 - 直接删除后续生成的重复迁移文件,手动修改
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
相关产品推荐
相关产品推荐

