以下是表格布局的示例;
CREATE TABLE test (id1 int, id2 int, auth boolean);
INSERT INTO test VALUES (1, 1, true);
我正在尝试将以下查询转换为knex.js框架;
UPDATE test as t
SET auth = c.auth
from (values (1, 1, false),(2, 1, false))
as c(id1, id2, auth)
where c.id1 = t.id1 AND c.id2 = t.id2;
select * from test
这是一个小提琴:http://sqlfiddle.com/#!17/62529/8
我环顾四周,找到了以下资源:github issue,update multiple queries (no conditional)
在尝试实施这些方法之后,我仍然没有成功,也不确定我哪里出错了。
我试图通过将原始的postgres查询包装到knex.raw语句中来强制执行查询,例如:
return knex.raw('' +
'UPDATE test as t ' +
'SET auth = c.auth ' +
'from (values (1, 1, false),(2, 1, false))' +
'as c(id1, id2, auth)' +
'where c.id1 = t.id1 AND c.id2 = t.id2;')
出现错误syntax error on or near « as »
我也尝试使用;
来关注github问题建议 let string = knex
.into('test t')
.update('auth, c.auth')
.values('(1, 1, false), (2, 1, false)')
.where(knex.raw('c.id1 = t.id1 AND c.id2 = t.id2'))
.toString()
knex.raw(string)
返回错误'values'不是函数。
我是knex和postgres的新手,所以我不确定我是否遗漏了一些非常明显的东西!非常感谢任何帮助。
答案 0 :(得分:3)
在原始版本中,您可能需要在false))as
处的'as'之前需要一个空格才能成为false)) as
...
我通过添加.on('query-error',
看到了这一点,如下所示。有了这些信息,您应该能够确定它是SQL引擎错误还是Knex错误,以及SQL是否按照您的需要生成。
return knex.raw('' +
'UPDATE test as t ' +
'SET auth = c.auth ' +
'from (values (1, 1, false),(2, 1, false)) ' +
'as c(id1, id2, auth)' +
'where c.id1 = t.id1 AND c.id2 = t.id2;')
.on('query-error', function(ex, obj) {
console.log("KNEX query-error ex:", ex, "obj:", obj);
}).then(function(retVal) {
console.log("Query ran okay.");
return retVal;
});
还有.on('query',
可以为您提供有关查询的信息,以帮助您做到正确。见:http://knexjs.org/#Interfaces-query
此致 加里。