fast-csv解析CSV后Sequelize bulkCreate报SequelizeUniqueConstraintError如何修复
问题原因
- 主键UUID默认值配置错误:你在模型定义里给id的
defaultValue直接写了uuidv4(),这会在模型初始化的时候就执行一次uuidv4生成固定值,所有批量插入的行都会复用同一个固定id,触发主键唯一约束冲突。单行插入的时候刚好只有一行用这个id,所以不会报错。 - 错误捕获机制失效:fast-csv的
parseFile是异步事件驱动的,外层的try/catch无法捕获on('end')回调里bulkCreate抛出的异步错误,且你没有给bulkCreate加错误处理逻辑,所以会出现Unhandled rejection提示。 - CSV字段潜在不匹配问题:你提供的CSV表头里
age前带有空格,解析后生成的字段名为" age",和模型定义的age字段不匹配,会导致插入时age字段为空。
修复方案
1. 修正UUID默认值配置
将id属性的默认值改为传入uuidv4函数本身,不要加执行括号,这样Sequelize会在插入每一行数据时单独调用函数生成唯一id:
id: { type: DataTypes.UUID, primaryKey: true, defaultValue: uuidv4, // 去掉括号,传入函数本身 allowNull: false }
2. 修正异步流程和错误捕获
将parseFile包装为Promise适配async/await语法,同时添加trim配置自动处理CSV字段空格问题:
module.exports = async () => { try { let csvData = []; // 包装为Promise适配异步捕获 await new Promise((resolve, reject) => { csv .parseFile(__basedir + "/test.csv", { headers: true, trim: true // 自动去除表头和字段值的前后空格 }) .on('data', (data) => { csvData.push(data); }) .on('end', () => resolve()) .on('error', (err) => reject(err)) }) // 等待批量插入完成,错误会被外层try/catch捕获 await Test.bulkCreate(csvData) // 注意此处模型名要和你实际导出的模型对应,原代码里写的Card_Report需确认是否为笔误 } catch (e) { console.error('Something went wrong', e) } }
内容的提问来源于stack exchange,提问作者Cissus
相关产品推荐
相关产品推荐

