升级到Prisma2后Prisma1是否还支持嵌套创建关联关系
报错原因
- 核心问题是Prisma1和Prisma2的关联字段命名、关联识别规则不兼容:Prisma1执行嵌套创建时,会按照自身内置的规则查找对应外键列自动填充关联ID,你当前Prisma2 Schema中定义的外键
userId不符合Prisma1的识别规则,导致Prisma1插入Admin数据时没有自动填充userId字段的值。 - 你在Prisma2 Schema中没有给
userId设置默认值也没有允许为空,数据库接收到缺少userId的插入请求时直接抛出字段无默认值的错误。 - 若升级过程中修改或删除了Prisma1原有的外键约束,也会导致Prisma1无法识别关联关系,不会自动填充外键值。
解决方案
方案1:调整Prisma2 Schema兼容Prisma1(无需修改业务代码)
确认Prisma1时期生成的Admin表外键实际列名,通过Prisma2的@map属性做字段映射,保持Prisma2逻辑字段名不变的同时匹配数据库实际列名,示例如下:
model Admin { id String @id @default(cuid()) @db.Char(30) name String @db.MediumText userId String @db.Char(30) @map("user") // 这里的"user"替换为Prisma1生成的实际外键列名 user User @relation(fields: [userId], references: [id], onUpdate: Restrict) }
修改后重新执行prisma generate即可。
方案2:调整Prisma1数据模型适配现有数据库字段
在Prisma1的datamodel中显式指定外键列名,让Prisma1识别到userId是关联User的外键,插入时自动填充值,示例如下:
type Admin { id: ID! @id name: String! user: User! @relation(link: INLINE) @db(name: "userId") }
方案3:修改业务代码(临时应急)
把嵌套创建的操作拆分为两次独立写入:先创建User获取生成的ID,再手动传入userId创建Admin,不需要修改Schema即可临时解决问题。
内容的提问来源于stack exchange,提问作者aproximation
相关产品推荐
相关产品推荐

