pg-обещание: обновление строки с текстовым столбцом массива с помощью pgp.helpers.update

Я пытаюсь обновить столбец текстового массива:

var data = [];

for (const tag of tags) {
    var tmp = {'rids': [rid], 'id': tag.id, 'uid' : uid};
    data.push(tmp);
}

const condition = pgp.as.format(' WHERE CAST(v.uid AS INTEGER) = t.uid and v.id = t.id');
const insertQuery = pgp.helpers.update(data, ['?id', '?uid', 'rids'], 'table_tags') + condition + ' ' + 'RETURNING t.tag';


return db.any(insertQuery);

Это работает, но заменяет значение столбцов.

Как сохранить текущее значение столбца и добавить новые?

Как это: {somevalue, someothervalue, newinsertedvalue} Вместо: {newinsertedvalue}

Это запрос, который я использовал в проекте php drupal:

db_query("UPDATE table_tags set rids = rids || (:rid) WHERE uid = :uid and id = :id", array(':rid' => '{'.$rid.'}', ':uid' => $uid, ':id' => $tag_id));

person MrJibus    schedule 28.02.2020    source источник
comment
Вы должны включить пример запроса PostgreSQL, который работает правильно для вас, тогда вы можете быть проинформированы об изменении использования pg-promise. Без него это даже не связано с pg-promise, а скорее с желаемым запросом и ожидаемым результатом.   -  person vitaly-t    schedule 28.02.2020
comment
Спасибо. Это рабочий пример запроса, который я хочу сгенерировать: update "table_tags" as t set "rids"= t.rids || v."rids" from (values(154,1,1315709),(153, 1,1315709)) as v("id","uid", "rids") WHERE CAST(v.uid AS INTEGER) = t.uid and v.id = t.id RETURNING t.tag Не уверен, что pgp.helpers может обрабатывать concat   -  person MrJibus    schedule 02.03.2020
comment
Это сильно отличается от того, что генерирует помощник update. Он устанавливает значения, а не связывает их с такой дополнительной логикой. Вам нужно будет предоставить собственный генератор обновлений.   -  person vitaly-t    schedule 02.03.2020
comment
Для вашего особого случая вы можете написать запрос статически, объединив его с динамической частью - значениями, которые вы можете сгенерировать с помощью helpers.values ​​.   -  person vitaly-t    schedule 02.03.2020


Ответы (1)


Ваша логика конкатенации значений - это особый случай, не поддерживаемый по умолчанию update. Вам нужно будет написать запрос статически, с динамической частью - значениями, сгенерированными через helpers.values ​​.


const values = helpers.values(data, ['id', 'uid', 'rids']);

const query = `UPDATE table_tags AS t SET rids = t.rids || v.rids FROM 
    (VALUES${values}) as v(id, uid, rids)
    WHERE CAST(v.uid AS INTEGER) = t.uid AND v.id = t.id RETURNING t.tag`.
person vitaly-t    schedule 02.03.2020
comment
Спасибо ! Это намного элегантнее того, что я сделал - person MrJibus; 03.03.2020