【问题标题】:Sequelize upsert with conditions on previous data使用先前数据的条件对 upsert 进行续集
【发布时间】:2019-09-08 06:06:01
【问题描述】:

我有一个接受 RESTful 样式请求的服务器。对于某类对象的 PUT,我想插入一条带有请求正文数据的新记录,或者更新以前的记录。为此,我正在使用 Sequelize upsert。

app.put('/someModel/:id', (req, res, next) => {
  const data = JSON.parse(JSON.stringify(req.body));
  data.id = req.params.id;
  models.SomeModel.upsert(data).then(() => {
    return models.SomeModel.findByPk(req.params.id);
  }).then(res.send.bind(res)).catch(next);
});

更新时,我只想更新以前没有更改过的数据库记录。也就是说,如果客户端 A 获取一条记录,然后客户端 B 修改该记录,然后客户端 A 随后尝试更新它,则请求应该失败,因为客户端 B 在客户端 A 的获取和更新之间更新了记录。 (在 HTTP 端,我使用的是 If-Unmodified-Since 请求标头。)

基本上,我需要一种方法:

UPDATE table
SET
  field1="value1",
  field2="value2"
WHERE
  id=1234 AND
  updatedAt="2019-04-16 17:41:10";

这样,如果记录之前已经更新过,这个查询不会修改数据。

如何使用 Sequelize upsert 生成这样的 SQL?

【问题讨论】:

    标签: node.js sequelize.js


    【解决方案1】:

    至少对于 MySql,这将是无效的 - upsert 导致

    insert into table (field1) values ('value1') on duplicate key update field1 = values(value1);
    

    语法不允许使用 WHERE 子句。也许是另一个 DBMS?

    使用原始 sql,您可以使用 IF 函数来伪造它:

    INSERT INTO table (field1) VALUES ('value1') ON DUPLICATE KEY UPDATE
      field1 = IF(updatedAt = "2019-04-16 17:41:10", values(field1), field1);
    

    但它有点丑。

    【讨论】:

    • 谢谢,是的,我认为 INSERT 和 UPDATE 之间的区别是我的问题的一部分。如果是 INSERT,则输入的任何值都可以。但是,如果执行 UPDATE 操作,我想确保自应用程序上次知道记录以来记录没有更改。
    • 我可能只是重组这个并将插入和更新解耦。
    猜你喜欢
    • 2020-12-01
    • 2014-04-04
    • 2022-01-07
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多