使用Object更新预准备语句

时间:2017-11-15 11:24:24

标签: node.js postgresql pg-promise

我有Object将列名映射到值。要更新的列事先不知道,并在运行时决定。

e.g。 map = {col1: "value1", col2: "value2"}

我想执行UPDATE查询,将包含这些列的表更新为相应的值。我可以这样做吗?如果没有,是否有一种优雅的方式来实现它而无需手动构建查询?

db.none('UPDATE mytable SET $1 WHERE id = 99', map)

2 个答案:

答案 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)