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

标签 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

这是一个 fiddle :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)

返回错误“值”不是函数。

我是 knex 和 postgres 的新手,所以我不确定我是否遗漏了一些非常明显的东西!非常感谢任何帮助。

最佳答案

在原始版本中,您可能需要在 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

问候, 加里。

关于postgresql - 如何使用 knex 和 postgresql 有条件地更新多行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47336087/

相关文章:

sql - 在特定行的值之后拆分表

postgresql - 如何使用 knex js、bookshelf js 更新 JSONB 列

javascript - 如何在 Bookshelf.js 中执行多连接查询?

node.js - NodeJS Bookshelf 用户-追随者关系示例

postgresql - pipelinedb 连续 View 不起作用

sql - 更新特定列后的 PostgreSQL 触发器

javascript - 如何将 2 个 postgres 数据库连接到我的应用程序?

javascript - Bookshelf.js,在 fetchAll() 方法后更新

c# - What NpgsqlDbType should be used to clear "Can' t write CLR type”错误

javascript - 数组与 Postgres 中的数组重叠