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

时间:2018-01-09 13:12:48

标签: knex.js

我对knex(和节点js)很新。我需要写插入如果存在,我无法做到这一点。

下面没有用,但是有办法吗?

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

1 个答案:

答案 0 :(得分:0)

当我尝试执行此操作时,.select.whereNotExists.insert函数之后被KNEX忽略。所以这里还有其他两种方法可以实现......

  1. 通过KNEX嵌入SQL。
  2. 使用KNEX首先尝试检索匹配,然后执行插入
    或不,取决于结果。
  3. 我从你的问题中假设的另一种方法不是你想要的方向,但我通常使用的方法是创建一个数据库约束, 拒绝重复。
  4. 在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站点中的查询错误和查询结果)此方法的缺点是重复无效地失败,因此没有人知道失败。

    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.
        })
    

    使用第二种方法,我怀疑您可能更容易遇到并发问题,如果您的应用程序使用量很高,那么有2个用户都会尝试使用意外结果进行“同步”更新。从好的方面来说,这种方法可以轻松捕获并响应用户重复的名称错误。

    希望这有帮助!加里。