You need to enable JavaScript to run this app. fast-csv解析CSV后Sequelize bulkCreate报SequelizeUniqueConstraintError如何修复
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 20:48:01