我有一个包含在函数中的查询(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
);
是否可以这样做?
答案 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';
上面的查询将为您提供表格中的列列表。
现在为了特定目的更新每一个,您可以将列名的结果集存储到变量中,并将该变量传递给函数以执行所需的操作。