创建或更新 Sequelize

新手上路,请多包涵

我在我的 Nodejs 项目中使用 Sequelize,我发现了一个我很难解决的问题。基本上我有一个 cron 从服务器获取对象数组,然后将其作为对象插入到我的数据库中(对于这种情况,卡通)。但是,如果我已经拥有其中一个对象,则必须对其进行更新。

基本上我有一个对象数组,并且可以使用 BulkCreate() 方法。但是当 Cron 再次启动时,它并没有解决它,所以我需要一些带有 upsert true 标志的更新。主要问题是:在所有这些创建或更新之后,我必须有一个只触发一次的回调。有谁知道我该怎么做?迭代一个对象数组..创建或更新它,然后得到一个回调?

感谢关注

原文由 Thiago Miranda de Oliveira 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

文档 中,您无需查询 where 即可在拥有对象后执行更新。此外,promise 的使用应该简化回调:

执行

function upsert(values, condition) {
    return Model
        .findOne({ where: condition })
        .then(function(obj) {
            // update
            if(obj)
                return obj.update(values);
            // insert
            return Model.create(values);
        })
}

用法

upsert({ first_name: 'Taku' }, { id: 1234 }).then(function(result){
    res.status(200).send({success: true});
});

笔记

  1. 这个操作不是原子的。
  2. 创建 2 个网络调用。

这意味着建议重新考虑该方法,并且可能只更新一次网络调用中的值,并且:

  1. 查看返回的值(即 rows_affected)并决定要做什么。
  2. 如果更新操作成功则返回成功。这是因为资源是否存在不在此服务的职责范围内。

原文由 Taku 发布,翻译遵循 CC BY-SA 4.0 许可协议

您可以使用 upsert 它更容易。

实施细节:

  • MySQL - 作为单个查询实现 INSERT values ON DUPLICATE KEY UPDATE values
  • PostgreSQL - 作为具有异常处理的临时函数实现: INSERT EXCEPTION WHEN unique_constraint UPDATE
  • SQLite - 作为两个查询实现 INSERT; UPDATE 。这意味着无论该行是否已经存在,都会执行更新
  • MSSQL - 使用 MERGE and WHEN (NOT) MATCHED THEN 作为单个查询实现— 请注意,无论行是创建还是更新,SQLite 都会为创建返回未定义。这是因为 SQLite 始终在单个查询中运行 INSERT OR IGNORE + UPDATE ,因此无法知道该行是否已插入。

原文由 Alvaro Silvino 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题