Node.js 未强制执行Sequelize唯一密钥

Node.js 未强制执行Sequelize唯一密钥,node.js,express,sequelize.js,Node.js,Express,Sequelize.js,我有以下数据模型 const User = Model.define('user', { id: { type: DataTypes.ID, defaultValue: DataTypes.ID_DEFAULT_VALUE, primaryKey: true }, merchant_id: { type: DataTypes.INTEGER, allowNull: false, unique: true } }); 当我调用Use

我有以下数据模型

const User = Model.define('user', {
  id: {
    type: DataTypes.ID,
    defaultValue: DataTypes.ID_DEFAULT_VALUE,
    primaryKey: true
  },
  merchant_id: {
    type: DataTypes.INTEGER,
    allowNull: false,
    unique: true
  }
});
当我调用
User.upsert({merchant\u id:id})时
使用相同的
商户id
两次使用相同的值(比如
1
),将创建商户id
1
的新行

我还尝试在我的模型定义中添加以下内容,但没有成功

indexes: [ { unique: true, fields: ['merchant_id'] } ]
根据文档,我只需要在字段选项哈希中添加
unique:true

将以下内容与Express一起使用

"sequelize": "^3.23.4",
"sqlite3": "^3.1.4"

您是使用sequelize创建数据库(先编写代码),还是仅仅与之交互(先创建数据库)?这个问题问得好,我不太确定我是否能回答。启动服务器时,我正在调用
sequelize.sync(…)
。我不确定我需要什么其他信息来正确回答这个问题。我想这取决于在你开始使用sequelize之前数据库是否存在。我的猜测是否定的,因为您使用的是sqlite。我不确定问题是什么——我的想法是,可能数据库是在没有索引的情况下创建的,而索引是在事实发生后添加到定义中的,并且针对现有数据库的
sequelize.sync()
不会删除并重新创建索引?不确定。如果您完全确定不介意丢失数据库中的所有数据,您可以尝试使用删除并重新创建所有表。您是对的。我重新启动了服务器,多次删除了所有行,但我需要删除并重新创建表。我确信有更微妙的东西可以创建索引,但这正在开发中。谢谢你的帮助!我希望这也能对其他人有所帮助。如果您想要一种处理数据库更改的声明性方法,可以查看他们的。这就是说,如果您仍处于开发阶段,那么在每次进行更改并在上线后使用迁移时从轨道上对其进行核爆可能更简单。我经常在开发过程中创建一个“种子”实现,以便在重新创建数据库后自动将一些数据插入到数据库中。