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

时间:2018-06-11 17:50:50

标签: 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 = ($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
);

是否可以这样做?

2 个答案:

答案 0 :(得分:0)

我将通过node-postgres GitHub回购发布Sehrope Sarkuni建议的解决方案。这对我帮助很大,并且符合我的要求:

  

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

     

可能但您必须使用列名构建SQL文本。如果你要动态构建SQL,你应该确保使用类似pg-format的东西来转义组件,或者使用处理这类事物的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在服务器上。

答案 1 :(得分:0)

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

您可以在以下查询的帮助下获取表的列名:

select column_name from information_schema.columns where table_name='fixtures' and table_schema='public';

上面的查询将为您提供表格中的列列表。

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