Как условно обновить несколько строк, используя knex с postgresql?

Вот пример расположения таблицы;

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/

Я осмотрелся и нашел следующие ресурсы: проблема с github, обновление нескольких запросов (без условий)

После попытки реализовать эти методы, я все еще не могу придумать, и не знаю, где я иду не так.

Я попытался перебором запроса, превратив свой исходный запрос 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, так что я не уверен, что упустил что-то болезненно очевидное! Буду признателен за любую оказанную помощь.

1 ответ

Решение

В сырой версии это выглядит так, как будто вам может понадобиться пробел перед "как" в false))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/

С уважением, Гэри.

Другие вопросы по тегам