如何使用 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

此致, 加里