Node.js 使用先前数据上的条件继续执行upsert

Node.js 使用先前数据上的条件继续执行upsert,node.js,sequelize.js,Node.js,Sequelize.js,我有一个接受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).th

我有一个接受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?

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

insert into table (field1) values ('value1') on duplicate key update field1 = values(value1);
语法不允许WHERE子句。也许是另一个数据库管理系统

对于原始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,那么任何值都可以。但是,如果执行了更新操作,我希望确保记录自应用程序上次知道以来没有更改。我可能只是重新构造它,并将插入和更新解耦。