我正在阅读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()
具有唯一约束要求的原因它?
答案 0 :(得分:17)
.findOrCreate
将使用您提供的参数查询数据库,如果没有匹配,它将使用相同的参数执行插入操作。而.upsert
的要点是更新或插入记录。在更新操作的情况下,逻辑指示您基于唯一键查找记录,并且只有在找到此唯一记录后,才会根据提供的参数更新其值。如果您无法找到唯一的记录,那么您才会执行插入。
我希望这是有道理的。
答案 1 :(得分:0)
关键区别在于ID字段。万一发生更新,您需要id字段。但有时,您不会使用id字段。例如,当从外部提供者创建用户时,使用字段fb表示,如果该用户记录已经存在,则将没有该用户记录的ID。在这种情况下,您将必须在fb返回的字段之一上使用findOrCreate,例如email。 findOrCreate用户,其中电子邮件是从fb返回的电子邮件