我有Object
将列名映射到值。要更新的列事先不知道,并在运行时决定。
e.g。 map = {col1: "value1", col2: "value2"}
。
我想执行UPDATE
查询,将包含这些列的表更新为相应的值。我可以这样做吗?如果没有,是否有一种优雅的方式来实现它而无需手动构建查询?
db.none('UPDATE mytable SET $1 WHERE id = 99', map)
答案 0 :(得分:1)
有没有一种优雅的方式来实现它而无需手动构建查询?
是的,通过使用helpers进行SQL生成。
您可以预先声明一个这样的静态对象:
const cs = new pgp.helpers.ColumnSet(['col1', 'col2'], {table: 'mytable'});
然后通过helpers.update
这样使用它const sql = pgp.helpers.update(data, cs) + /* WHERE clause with the condition */;
// and then execute it:
db.none(sql).then(data => {}).catch(error => {})
这种方法适用于单个对象和一个对象数组,您只需相应地附加更新条件。
另请参阅:PostgreSQL multi-row updates in Node.js
如果事先不知道列名怎么办?
为此,请参阅:Dynamic named parameters in pg-promise,并注意正确的答案取决于您打算如何投射此类列的类型。
答案 1 :(得分:0)
这样的事情:
map = {col1: "value1", col2: "value2",id:"existingId"}.
db.none("UPDATE mytable SET col1=${col1}, col2=${col2} where id=${id}", map)