簡體   English   中英

將列名作為參數傳遞-Postgres和Node JS

[英]Pass column name as argument - Postgres and Node JS

我有一個包裝在函數中的查詢(更新語句),並且在腳本編寫過程中需要在多個列上執行相同的語句

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

有可能做到這一點嗎?

我將發布由Sehrope Sarkuni通過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,因此可能會更好服務器。

要獲取表的列名,您可以查詢information_schema.columns表,該表存儲表的列結構的詳細信息,這將幫助您構建動態查詢以基於特定結果更新特定列。

您可以在以下查詢的幫助下獲取表的列名:

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

上面的查詢將為您提供表中的列列表。

現在要針對特定​​目的更新每個,您可以將列名的結果集存儲到變量中,然后將該變量傳遞給函數以執行所需的操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM