代码之家  ›  专栏  ›  技术社区  ›  Richlewis

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

  •  0
  • Richlewis  · 技术社区  · 6 年前

    我有一个封装在函数中的查询(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);
    

    我有许多列要在脚本的不同点上更新,每个列都需要在当时完成。我希望能够调用one函数,传递列名、值和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 回复  |  直到 6 年前
        1
  •  0
  •   Karthik    6 年前

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

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

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

    上面的查询将给出表中列的列表。

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

        2
  •  0
  •   halfer Rajnish Kumar    6 年前

    我将通过 node-postgres GitHub回购。这对我很有帮助,也能满足我的要求:

    列名不是标识符,不能指定为参数。它们必须包含在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。