首页 > 解决方案 > SequelizeUniqueConstraintError 创建方法只添加一行

问题描述

我正在尝试使用 fast-csv 解析 csv 文件,最后将所有行存储在数据库中并使用 sequelize

这是我解析数据的脚本:

module.exports = async () => {
  try {
let csvData = [];

    csv
      .parseFile(__basedir + "/test.csv", { headers: true })
      .on('data', (data) => {
        csvData.push(data);
      })
      .on('end', () => {
          Card_Report.bulkCreate(csvData)
      });
} catch (e) {
    console.error('Something went wrong', e)
  }
}

这是我的表模型:

  const Test= sequelize.define(
      'test',
      {
        id: {
          type: DataTypes.UUID,
          primaryKey: true,
          defaultValue: uuidv4(),
          allowNull: false
        },
        name: {
          type: DataTypes.STRING,
        },
        age: {
          type: DataTypes.INTEGER,
        }
        }, {
            createdAt: false,
            updatedAt: false,        
            tableName: 'test'
         }
    )
    return Test
  }

这是我的 csv 文件:

name, age  
nina, 24
sarah, 23

当我运行脚本时,出现此错误:

Unhandled rejection SequelizeUniqueConstraintError: Validation error

但是当我的 csv 文件中只有一行时,它会正确地将行添加到表中

我怎样才能解决这个问题?

标签: node.jscsvsequelize.jsfast-csv

解决方案


您似乎获得了相同的 id,因为 Sequelize 中的所有模型都“准备”一次,并且您的函数uuidv4()只运行一次。因此,对于您插入数据库的每一行,它将具有相同的 uuid。您可以尝试像这样减轻它:

id: {
  type: DataTypes.UUID,
  defaultValue: DataTypes.UUIDV4, <- try something like this
  primaryKey: true,
},

因此,您正在转移为数据库上的每一行生成唯一 UUID 的责任

PS:您的数据库可能需要一个 uuid 扩展,如下所示:

CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

推荐阅读