【问题标题】:pg-promise: Updating row with array text column with pgp.helpers.updatepg-promise:使用 pgp.helpers.update 更新带有数组文本列的行
【发布时间】:2020-06-12 21:20:37
【问题描述】:

我正在尝试更新文本数组列:

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));

【问题讨论】:

  • 您应该包含一个适合您的 PostgreSQL 查询示例,然后可以告知您使用 pg-promise 的更改。没有它,它甚至与pg-promise 无关,而是与您想要的查询及其结果预期有关。
  • 谢谢。这是我要生成的工作查询示例: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
  • 这与 update 助手生成的完全不同。它设置值,它不会将它们与这种额外的逻辑连接起来。您必须提供自定义更新生成器。
  • 对于您的特殊情况,您可以静态编写查询,将其与动态部分 - 值合并,您可以通过 helpers.values 生成。

标签: node.js pg-promise


【解决方案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`.

【讨论】:

  • 谢谢!它比我所做的要优雅得多
猜你喜欢
  • 1970-01-01
  • 2018-04-15
  • 2017-11-29
  • 2017-04-03
  • 1970-01-01
  • 1970-01-01
  • 2021-07-03
  • 1970-01-01
  • 2015-11-23
相关资源
最近更新 更多