如何使用knex和postgresql有条件地更新多行?

时间:2017-11-16 17:46:22

标签: postgresql knex.js bookshelf.js

以下是表格布局的示例;

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 issueupdate 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的新手,所以我不确定我是否遗漏了一些非常明显的东西!非常感谢任何帮助。

1 个答案:

答案 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

此致 加里。