sequelize中findOrCreate()和upsert()之间的区别

时间:2015-01-31 07:37:56

标签: node.js postgresql express sequelize.js

我正在阅读over the doc并提到了两种进行upsert的方法:findOrCreate()upsert()。我阅读了描述,但我仍然不清楚它们的区别。

upsert()继续说:

Note that the unique index must be defined in your sequelize model and not just in the table. Otherwise you may experience a unique constraint violation, because sequelize fails to identify the row that should be updated.

这是否意味着upsert()明确要求我在模型中定义id UNIQUE主要字段?即:

var Something = sequelize.define("Something", { id: { 
                    type: DataTypes.INTEGER, 
                    primaryKey: true, 
                    unique: true, 
                    allowNull: false}});

如果是,为什么findOrCreate()没有这个限制?

有人可以解释何时应使用findOrCreate()upsert()的用例,以及当upsert()似乎不需要时findOrCreate()具有唯一约束要求的原因它?

2 个答案:

答案 0 :(得分:17)

.findOrCreate将使用您提供的参数查询数据库,如果没有匹配,它将使用相同的参数执行插入操作。而.upsert的要点是更新或插入记录。在更新操作的情况下,逻辑指示您基于唯一键查找记录,并且只有在找到此唯一记录后,才会根据提供的参数更新其值。如果您无法找到唯一的记录,那么您才会执行插入。

我希望这是有道理的。

答案 1 :(得分:0)

关键区别在于ID字段。万一发生更新,您需要id字段。但有时,您不会使用id字段。例如,当从外部提供者创建用户时,使用字段fb表示,如果该用户记录已经存在,则将没有该用户记录的ID。在这种情况下,您将必须在fb返回的字段之一上使用findOrCreate,例如email。 findOrCreate用户,其中电子邮件是从fb返回的电子邮件