我对knex(和节点js)很新。我需要写插入如果存在,我无法做到这一点。
下面没有用,但是有办法吗?
var val = "water";
knex('ingredients').insert({'name': val})
.select(val)
.whereNotExists(knex('ingredients').where('name', val))
)
答案 0 :(得分:0)
当我尝试执行此操作时,.select
和.whereNotExists
在.insert
函数之后被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站点中的查询错误和查询结果)此方法的缺点是重复无效地失败,因此没有人知道失败。
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个用户都会尝试使用意外结果进行“同步”更新。从好的方面来说,这种方法可以轻松捕获并响应用户重复的名称错误。
希望这有帮助!加里。