种子期间的SequelizeUniqueConstraintError

时间:2015-11-16 22:26:12

标签: sequelize.js

我有一个使用Sequelize的node.js应用程序。我目前正在针对SQLite进行简单的开发设置和测试,但将转向MySQL进行生产。我使用sequelize-cli来创建模型和迁移,所有工作都没有任何问题,我已经确认这些表是使用SQLite浏览器工具创建的。我现在的问题是当我运行下面的种子文件时(数据库当前为空)我收到以下错误。

错误:

Unhandled rejection SequelizeUniqueConstraintError: Validation error
at Query.formatError (/Users/abc/repos/myProject/node_modules/sequelize/lib/dialects/sqlite/query.js:231:14)
at Statement.<anonymous> (/Users/abc/repos/myProject/node_modules/sequelize/lib/dialects/sqlite/query.js:47:29)
at Statement.replacement (/Users/abc/repos/myProject/node_modules/sqlite3/lib/trace.js:20:31)

迁移:

'use strict';
module.exports = {
  up: function(queryInterface, Sequelize) {
    return queryInterface.createTable('Questions', {
      id: {
        allowNull: false,
        autoIncrement: true,
        primaryKey: true,
        type: Sequelize.INTEGER
      },
      type: {
        allowNull: false,
        type: Sequelize.INTEGER
      },
      text: {
        allowNull: false,
        type: Sequelize.STRING
      },
      nextQuestionId: {
        type: Sequelize.INTEGER
      },
      createdAt: {
        allowNull: false,
        type: Sequelize.DATE
      },
      updatedAt: {
        allowNull: false,
        type: Sequelize.DATE
      }
    });
  },
  down: function(queryInterface, Sequelize) {
    return queryInterface.dropTable('Questions');
  }
};

模特:

'use strict';
module.exports = function(sequelize, DataTypes) {
  var Question = sequelize.define('Question', {
    id: {
      allowNull: false,
      autoIncrement: true,
      primaryKey: true,
      type: DataTypes.INTEGER
    },
    type: {
      allowNull: false,
      type: DataTypes.INTEGER
    },
    text: {
      allowNull: false,
      type: DataTypes.STRING
    },
    nextQuestionId: {
      type: DataTypes.INTEGER
    }
  }, {
    classMethods: {
      associate: function(models) {
        Question.belongsTo(Question, {as: 'nextQuestion', foreignKey: 'nextQuestionId'});
        Question.hasMany(models.Answer);
        Question.hasMany(models.questionoption, {as: 'options'});
      }
    }
  });
  return Question;
};

种子:

'use strict';
module.exports = {
  up: function (queryInterface, Sequelize) {
    return queryInterface.bulkInsert('Questions', [
      {type: 0, text: 'Question A'},
      {type: 5, text: 'Question B', nextQuestionId: 4},
      {type: 5, text: 'Question C', nextQuestionId: 4},
      {type: 0, text: 'Question D'},
      {type: 0, text: 'Question E'},
      {type: 0, text: 'Question F'},
      {type: 0, text: 'Question G'},
      {type: 0, text: 'Question H'},
      {type: 0, text: 'Question I'}
    ], {});
  } ...

我试过查看文档和谷歌搜索答案,似乎没有暗示这是一个常见的问题。我没有定义任何唯一的列(当然,除了主键,但它是一个autoIncrement)如果我有更多的信息或线索,哪个列导致cli的问题,那么我会至少能够尝试一些不同的东西,但没有帮助。我已经尝试在SQL中手动运行等效的插入并且它们有效,所以我不认为它是数据库拒绝插入,它似乎是Sequelize内部的东西。

任何帮助都会非常感激,因为我已经尝试了几天的选择而没有运气。

3 个答案:

答案 0 :(得分:17)

该错误似乎极具误导性。解决方案,无论是否正确,我都不确定,但将createdAt和updatedAt属性添加到对象允许它们成功播种。我的假设是这些将由ORM自动处理。工作的种子看起来像这样(任何模型或迁移都没有变化)。

'use strict';

module.exports = {
  up: function (queryInterface, Sequelize) {
    return queryInterface.bulkInsert('Questions', [
      {type: 0, text: 'Question A', createdAt: new Date(), updatedAt: new Date()},
      {type: 5, text: 'Question B', nextQuestionId: 4, createdAt: new Date(), updatedAt: new Date()},
      {type: 5, text: 'Question C', nextQuestionId: 4, createdAt: new Date(), updatedAt: new Date()},
      {type: 0, text: 'Question D', createdAt: new Date(), updatedAt: new Date()},
      {type: 0, text: 'Question E', createdAt: new Date(), updatedAt: new Date()},
      {type: 0, text: 'Question F', createdAt: new Date(), updatedAt: new Date()},
      {type: 0, text: 'Question G', createdAt: new Date(), updatedAt: new Date()},
      {type: 0, text: 'Question H', createdAt: new Date(), updatedAt: new Date()},
      {type: 0, text: 'Question I', createdAt: new Date(), updatedAt: new Date()}
    ], {});
  }, ...

答案 1 :(得分:0)

有同样的问题。 我添加了丢失的createdAtupdatedAt列,但错误仍然是主张。 我在;函数的末尾错过了bulkInsert

答案 2 :(得分:0)

只需将timeStamps:true添加到您的模型中即可。

module.exports = {
   ......
   .......
   updatedAt: {
    allowNull: false,
    type: Sequelize.DATE
  }
}, {
  timeStamps: true  // -> Add this
 }
}