[英]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.