【问题标题】:pg-promise using named parameters in an UPDATE SET statement在 UPDATE SET 语句中使用命名参数的 pg-promise
【发布时间】:2020-04-18 09:47:15
【问题描述】:

我想用命名参数实现一个 UPDATE SET 语句?有可能吗?

对于像这样的对象:

{
    _id: 1,
    name: "new_name",
    password: "new_password",
    subscribed: true,
    email: "new_email@email.com"
}

这是我的猜测:

UPDATE
    accounts
SET
    $(this:name) = $(this:csv)
WHERE
    _id = $(this._id)

对象字段可能因发送的请求而异,因此我不想在其中“硬编码”参数。

【问题讨论】:

  • 你为什么会这样猜测?图书馆网站上有大量示例,例如 Learn by Example。根据 PostgreSQL 语法,您通常通过逗号列出它们来更新列。在这里使用 this 不会为您带来任何魔力。
  • @vitaly-t 我想也许会有某种我可能错过的内置循环。我从文档中知道this:csv 会自动将其转换为.join(",") 的一种东西。我还在考虑以某种方式在更新中使用select $(this:csv)
  • 每个过滤器,:name:csv 确实提供了一些基本的自动化。但是在SET 操作的情况下,您需要一个组合。因此,除非您选择 multi-row update approach,否则您必须明确使用这些列。

标签: javascript node.js pg-promise


【解决方案1】:

pg-promise 中自动执行SET 操作的唯一方法是,如果您开始使用多行更新方法,使用ColumnSet-s。

// create column set statically, once:
const cs = new pgp.helpers.ColumnSet(['?_id', 'name', 'password', 'subscribed', 'email'],
                                     {table: 'accounts'});

生成更新查询时...

const where = pgp.as.format('WHERE _id = $1', [_id]);
const update = `${pgp.helpers.update(data, cs)} ${where}`;

执行查询:

await db.none(update);

【讨论】:

  • 我目前没有使用我的代码,但您认为这样的方法可行吗? UPDATE accounts SET ($(this:name)) = (SELECT $(this:csv);
  • 如果您尝试,它可能会。但这完全是一种不同类型的查询,与您提出的查询不同。
  • 我也欢迎这样的功能,正如 OP 所要求的那样,类似于 ... SET ${this:combine} WHERE ... 并且它可以根据为语句提供的 json 对象生成像 name1 = value1, name2 = value2,.. 这样的逗号分隔对。跨度>
  • @Zavael 您可以使用helpers.sets 生成分配。
  • 是的,但我忘了提到我正在使用您的QueryFile 中建议的外部 sql 脚本,但现在我很想用这个帮助程序一/两个衬里替换所有脚本 :)
猜你喜欢
  • 2021-07-24
  • 2017-04-17
  • 1970-01-01
  • 1970-01-01
  • 2017-11-18
  • 2018-10-06
  • 2017-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多