续集:如何将字段排除在``upsert''方法中更新



情况

  • 我正在使用semelize的(v5.8.9( upsert插入/更新记录的方法在带有唯一索引的表中。
  • 我使用的是Postgres 11,每个表都有字段createdAtcreatedByupdatedAtupdatedBy

问题

当我在表中添加记录时,续集会生成这样的sql:

CREATE OR REPLACE FUNCTION pg_temp.sequelize_upsert
(OUT created boolean, OUT primary_key text)  AS $func$ 
BEGIN INSERT INTO "table1" ("name","created_by","updated_by","created_at","updated_at") 
VALUES (...) RETURNING "id" INTO primary_key; created := true; 
EXCEPTION WHEN unique_violation THEN 
UPDATE "table1" SET ...,"created_by"='user1',"updated_by"='user1',"updated_at"='2019-07-03 23:45:05.872 +00:00' 
WHERE ("id" IS NULL OR "name" = '...') 
RETURNING "tag_id" INTO primary_key; created := false; 
END; $func$ LANGUAGE plpgsql; 
SELECT * FROM pg_temp.sequelize_upsert();

正如我们可以看到的续集正在更新记录时的create_by字段(unique_violation(。

我找不到解决方案或解决方法,因此可以将创建的_BY从更新中排除。我还喜欢坚持使用upsert,因为它比通过选择检查存在然后插入或更新更有效。任何建议都将不胜感激。

我知道我可以指定fields参数,但是根据DOC:

The fields to insert / update. Defaults to all changed fields

但是,就我的插入成功而我确实需要插入created_by字段。

我还在考虑在续集中提出功能请求,以便在模型定义中我可以注册一个字段列表,这些字段应从所有更新(实例保存,model.update,upsert等(中排除,而不仅仅是createdAt

在UPSERT方法中,您可以将对象作为第二个参数,带有 fields 键,以提供插入或更新的字段列表。

检查此文档:

http://docs.sequesselizejs.com/class/lib/model.js~model.html#static-method-upsert

db.model.upsert({
  ...yourData
},{
  fields: [...NameOfFieldsToBeUpdated]
}).then(function(test){})

相关内容