gpt4 book ai didi

sequelize.js - Sequelize : How to exclude fields from being updated by `upsert` method

转载 作者:行者123 更新时间:2023-12-03 22:17:24 39 4
gpt4 key购买 nike

情况

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

  • 问题

    当我在表中插入一条记录时,Sequelize 会生成这样的 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();

    正如我们所看到的,当记录已经存在(unique_violation)时,Sequelize 正在更新 created_by 字段。

    我找不到解决方案或解决方法,以便可以从更新中排除 created_by。我也喜欢坚持使用 upsert,因为它比通过选择检查存在然后插入或更新更有效。任何建议表示赞赏。

    我知道我可以指定 fields 参数,但根据 doc :
    The fields to insert / update. Defaults to all changed fields
    但在我的情况下,如果 upsert 插入成功,我确实需要插入 created_by 字段。

    我也在考虑在 Sequelize 中提出一个功能请求,以便在模型定义中我可以注册一个应该从所有更新(实例保存、Model.update、upsert 等)中排除的字段列表,而不仅仅是 createdAt

    最佳答案

    在 upsert 方法中,您可以将对象作为第二个参数传递给 字段 键,以提供要插入或更新的字段列表。

    检查此文档:

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

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

    关于sequelize.js - Sequelize : How to exclude fields from being updated by `upsert` method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56881559/

    39 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com