Prisma中使用createMany插入带外键数据触发外键约束错误如何解决?
解决方案
1. 外键约束报错修复
你遇到的Foreign key constraint failed on the field: Animals_categoryName_fkey报错,是因为插入Animals表数据时,关联的categoryName字段值(示例中的cats、mammals)在Category表中不存在,外键约束要求从表的关联字段值必须在主表对应字段中已存在。
修复步骤:
- 先插入Category表的基础数据,再执行Animals数据的插入操作,示例代码如下:
const seedData = async () => { // 先插入分类数据 await prisma.category.createMany({ data: [ { categoryName: "cats", image: "cats-image-url" }, { categoryName: "mammals", image: "mammals-image-url" } // 补充其他需要的分类数据 ], skipDuplicates: true // 避免重复插入时报错 }) // 分类插入完成后,再插入动物数据 await prisma.animals.createMany({ data: [ // 你原有定义的AnimalsData数组内容 ] }) } seedData() .catch(e => {throw e}) .finally(async () => {await prisma.$disconnect()})
如果需要更灵活的关联插入,也可以使用单条prisma.animals.create配合connect参数关联已存在的分类,或者嵌套create直接创建关联分类。
2. prisma db seed命令不触发逻辑修复
你使用的Prisma 2.24版本中db seed属于预览功能,需要先完成以下配置才能正常运行:
- 在项目根目录的
package.json中添加seed配置项:
{ "prisma": { "seed": "node prisma/seed.js" } }
- 确认你的seed脚本路径和配置中指定的路径一致,默认需要放在prisma目录下命名为seed.js
- 确认seed脚本中的逻辑会主动执行,不需要等待命令隐式调用main函数,直接在脚本中调用你写的执行逻辑即可
内容的提问来源于stack exchange,提问作者Shiladitya Thakur
相关产品推荐
相关产品推荐

