Node.js 将列名作为参数传递-Postgres和Node JS

Node.js 将列名作为参数传递-Postgres和Node JS,node.js,postgresql,Node.js,Postgresql,我有一个封装在函数中的查询(Update语句),在脚本编写过程中需要在多个列上执行相同的语句 async function update_percentage_value(value, id){ (async () => { const client = await pool.connect(); try { const res = await client.query('UPDATE fixtures SET column_1_percentage = (

我有一个封装在函数中的查询(Update语句),在脚本编写过程中需要在多个列上执行相同的语句

async function update_percentage_value(value, id){
  (async () => {
    const client = await pool.connect();
    try {
      const res = await client.query('UPDATE fixtures SET column_1_percentage = ($1) WHERE id = ($2) RETURNING *', [value, id]);
    } finally {
      client.release();
    }
  })().catch(e => console.log(e.stack))
}
然后我调用这个函数

update_percentage_value(50, 2);
我有许多列要在脚本的不同点更新,每一列都需要在同一时间完成。我希望能够只调用一个函数,传递列名、值和id

我的桌子如下所示

CREATE TABLE fixtures (
  ID SERIAL PRIMARY KEY,
  home_team VARCHAR,
  away_team VARCHAR,
  column_1_percentage INTEGER,
  column_2_percentage INTEGER,
  column_3_percentage INTEGER,
  column_4_percentage INTEGER
);

有可能做到这一点吗

我将通过
节点postgres
GitHub repo发布Sehrope Sarkuni建议的解决方案。这对我有很大帮助,并满足了我的需求:

没有列名是标识符,不能将它们指定为参数。它们必须包含在SQL命令的文本中

这是可能的,但您必须使用列名构建SQL文本。如果您要动态构建SQL,您应该确保使用类似pg格式的东西来转义组件,或者使用处理这类事情的ORM

比如:

const format = require('pg-format');

async function updateFixtures(id, column, value) {
  const sql = format('UPDATE fixtures SET %I = $1 WHERE id = $2', column);
  await pool.query(sql, [value, id]);
}
另外,如果要对同一行进行背对背的多个更新,那么最好使用一个UPDATE语句来修改所有列,而不是单独的语句,因为它们会更慢,并且在服务器上生成更多WAL


要获取表的列名,可以查询存储表的列结构详细信息的information_schema.columns表,这将有助于构建动态查询,以便根据特定结果更新特定列

您可以通过以下查询获得表的列名:

select column_name from information_schema.columns where table_name='fixtures' and table_schema='public';
上面的查询将为您提供表中的列列表


现在要为特定目的更新每个列,可以将列名的结果集存储到一个变量,并将该变量传递给函数以执行所需的操作。

是的,例如,可以使用PL/pgSQL执行动态SQL语句。不过,您也可以更新一条语句中的所有列(如果数据集很大,则可能成批更新)。请给出示例表结构、数据和预期结果。在这个阶段,您能否解释一下如何传递列名,因此在这个示例中
column\u 1\u percentage
感谢您提供了一些我知道您需要执行动态语句的信息,这意味着您可以使用匿名DO代码块或将动态语句包装在Postgres函数中,然后向其传递参数。如果没有我所要求的,我无法为您提供解决方案。好的,我将用表格结构更新问题。您能提供一个您想要实现的示例吗?我现在还不清楚。是否要调用一个SQL,该SQL将为指定的每一列运行多个单独的UPDATE语句?请在您的问题中加入MVCE,以便我们能够帮助您。感谢您花时间回答,但请查看我发布的答案。我认为你的回答与我正在做的事情无关。