Как условно обновить несколько строк, используя 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/
С уважением, Гэри.