gpt4 book ai didi

knex.js - 如果 knex 中不存在值,如何插入(nodejs)

转载 作者:行者123 更新时间:2023-12-03 16:52:30 34 4
gpt4 key购买 nike

我对 knex(和 node js)很陌生。如果存在,我需要编写插入,但我无法执行此操作。

下面不起作用,但有没有办法做到这一点?

var val = "water";
knex('ingredients').insert({'name': val})
.select(val)
.whereNotExists(knex('ingredients').where('name', val))
)

最佳答案

当我尝试这样做时,.select.whereNotExists当它们出现在 .insert 之后时被 KNEX 忽略功能。所以这里有另外两种到达那里的方法......

  • 通过 KNEX 嵌入 SQL。
  • 使用 KNEX 首先尝试检索匹配项,然后进行插入
    与否,取决于结果。
  • 我从你的问题中假设的另一种方法不是你想要的方向,但我通常使用的方法是创建一个数据库约束,它将
    拒绝重复。

  • 在 KNEX 中嵌入 SQL:

    你想要的 SQL 看起来像:
    INSERT INTO ingredients (name)
    SELECT "name_val"
    WHERE NOT EXISTS
    (SELECT 1 FROM ingredients WHERE name = "name_val");

    因此,将其放入 KNEX 看起来像:
    var val = "water";
    var rawStr = "INSERT INTO ingredients (name) SELECT ? WHERE NOT EXISTS(SELECT 1 FROM ingredients WHERE name = ?)";
    return knex.raw(rawStr, [val, val])
    .on('query', function(data) {
    console.log("ON-QUERY data:", data);
    });

    可选 .on('query'是一个非常方便的故障排除工具,用于查看您是否获得了您期望的 SQL。 (另请参阅:knexjs.org 站点中的 query-error 和 query-results)此方法的一个缺点是重复失败是静默的,因此没有人知道失败。

    native KNEX:

    var val = "water";
    return knex('ingredients')
    .select()
    .where('name', val)
    .then(function(rows) {
    if (rows.length===0) {
    // no matching records found
    return knex('ingredients').insert({'name': val})
    } else {
    // return or throw - duplicate name found
    }
    })
    .catch(function(ex) {
    // you can find errors here.
    })

    使用第二种方法,我怀疑您可能更容易受到并发问题的影响,如果您的应用程序使用量很高,那么两个用户都会尝试进行“同时”更新,但结果却出乎意料。从好的方面来说,此方法可以轻松捕获并响应用户存在重复名称错误。

    关于knex.js - 如果 knex 中不存在值,如何插入(nodejs),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48168988/

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