如何使用 knex 和 postgresql 有条件地更新多行?
How to conditionally update multiple rows using knex with postgresql?
这是 table 布局的示例;
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
这是一个fiddle:http://sqlfiddle.com/#!17/62529/8
我环顾四周,找到了以下资源:github issue,
在尝试实现这些方法后,我仍然没有成功,我不确定我哪里出错了。
我试图通过将我原来的 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)
其中returns错误'values'不是函数。
我是 knex 和 postgres 的新手,所以我不确定我是否遗漏了一些非常明显的东西!非常感谢任何帮助。
在原始版本中,您可能需要在 false))as
处的 'as' 之前添加一个 space 才能成为 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
此致,
加里
这是 table 布局的示例;
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
这是一个fiddle:http://sqlfiddle.com/#!17/62529/8
我环顾四周,找到了以下资源:github issue,
在尝试实现这些方法后,我仍然没有成功,我不确定我哪里出错了。
我试图通过将我原来的 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)
其中returns错误'values'不是函数。
我是 knex 和 postgres 的新手,所以我不确定我是否遗漏了一些非常明显的东西!非常感谢任何帮助。
在原始版本中,您可能需要在 false))as
处的 'as' 之前添加一个 space 才能成为 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
此致, 加里