运行prisma migrate dev触发seed时报SQLite连接错误,单独运行seed正常
问题根因
该报错是Prisma 3.x版本的已知问题:执行prisma migrate dev时自动触发的seed任务,会复用迁移流程的数据库事务连接,当前seed逻辑采用循环逐条插入数据的方式,查询次数多、执行时间长,超过了SQLite默认的查询超时阈值,就会触发连接超时报错。
单独执行npx prisma db seed时,seed任务会创建独立的数据库连接池,不受迁移事务的超时限制,因此可以正常执行完成。
解决方案
可任选以下一种方案解决问题:
- 优化seed插入逻辑(推荐)
把循环逐条create替换为批量插入createMany,大幅减少查询次数、缩短执行时间,修改后的seed.js核心逻辑如下:async function main() { console.log(`Start seeding ...`); await prisma.note.createMany({ data: notesData }); await prisma.noteAttributes.createMany({ data: noteAttributesData }); await prisma.noteChangeLog.createMany({ data: noteChangeLogsData }); await prisma.tag.createMany({ data: tagsData }); await prisma.noteOnTag.createMany({ data: noteOnTagsData }); console.log(`Seeding finished.`); } - 延长查询超时时间
实例化PrismaClient时手动配置更长的查询超时阈值,适配大数据量的插入场景:const prisma = new PrismaClient({ queryTimeout: 15000 // 单位为毫秒,可根据数据量大小调整 }); - 拆分迁移和seed执行步骤
执行迁移时跳过自动seed,迁移完成后手动执行seed命令:# 执行迁移,跳过自动seed prisma migrate dev --name init --skip-seed # 手动执行seed npx prisma db seed - 升级Prisma版本
当前使用的3.4.2属于较老的版本,Prisma 4.x及以上版本已经优化了迁移阶段seed的连接管理逻辑,升级到最新稳定版也可以修复该问题。
内容的提问来源于stack exchange,提问作者Peter Kellner
相关产品推荐
相关产品推荐

