【问题标题】:Proper Sequelize flow to avoid duplicate rows?适当的 Sequelize 流程以避免重复行?
【发布时间】:2022-01-29 02:25:42
【问题描述】:

我在我的节点 js 服务器中使用 Sequelize。我以验证错误告终,因为我的代码尝试写入记录两次,而不是创建一次然后更新它,因为它已经在 DB (Postgresql) 中。

这是我在请求运行时使用的流程:

const latitude = req.body.latitude;
var metrics = await models.user_car_metrics.findOne({ where: { user_id: userId, car_id: carId } }) 

if (metrics) {
    metrics.latitude = latitude;
    .....
} else {
    metrics = models.user_car_metrics.build({
        user_id: userId,
        car_id: carId,
        latitude: latitude
        ....
    });
}

var savedMetrics = await metrics();
return res.status(201).json(savedMetrics);

有时,如果客户端以非常快的速度调用端点两次或更多次,则上述端点会尝试在user_car_metrics 中保存两个新行,使用相同的user_idcar_id,两者都是桌子上的 FK usercar

我有一个约束:

ALTER TABLE user_car_metrics DROP CONSTRAINT IF EXISTS user_id_car_id_unique, ADD CONSTRAINT user_id_car_id_unique UNIQUE (car_id, user_id);

重点是,给定的user_idcar_id 对只能有一个条目。

因此,我开始看到验证问题,在查看并添加日志后,我意识到上面的代码在表中添加了重复项(没有约束)。如果存在约束,当上面的代码尝试插入重复记录时,我会收到验证错误。

问题是,我该如何避免这个问题?如何构造代码,使其不会尝试创建重复记录。有没有办法序列化这个?

【问题讨论】:

    标签: node.js postgresql sequelize.js


    【解决方案1】:

    如果您有唯一约束,那么您可以使用 upsert 插入或更新记录,具体取决于您是否有具有相同主键值或列值的记录在唯一约束中。

    await models.user_car_metrics.upsert({
            user_id: userId,
            car_id: carId,
            latitude: latitude
            ....
        })
    

    upsert

    PostgreSQL - 使用 ON CONFLICT DO UPDATE 实现。如果更新数据包含 PK 字段,则选择 PK 作为默认冲突键。否则,将选择第一个唯一约束/索引,它可以满足冲突键要求。

    【讨论】:

    • 有道理。我会测试一下。谢谢
    • 好的,所以,如果一切顺利,upsert 只会返回一个布尔值 (true)。有没有办法在不高兴的电话中恢复记录?我问是因为我的逻辑也取决于可能的现有记录数据。无论如何,我会将其标记为正确答案,因为它回答了问题。谢谢。
    • 正如returns an array with two elements, the first being the new record and the second being true if it was just created or false if it already existed (except on Postgres and SQLite, which can't detect this and will always return null instead of a boolean). 所说,对于 PostgreSQL,您无法确定记录是否是新记录
    • 有趣,我把它注销了,我只得到一个布尔值。 console.log(` 指标:${JSON.stringify(metrics)}`)。第一次记录“真”,然后在其余时间记录“假”(记录已经存在)。我没有看到任何记录...
    • 好的,我使用的是“无效”版本。需要更新模块。 ?
    猜你喜欢
    • 2019-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-17
    • 1970-01-01
    • 2018-12-03
    • 1970-01-01
    相关资源
    最近更新 更多