使用Object更新准备的语句

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

例如map = {col1: "value1", col2: "value2"}

我想执行一个UPDATE查询,将这些列的表更新为相应的值。 我可以做以下吗? 如果没有,是否有一个优雅的方式,而不需要手动构build查询?

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

有没有一个优雅的方式做到这一点,而无需手动build立查询?

是的,通过使用助手来生成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 => {}) 

这种方法既可以处理单个对象,也可以处理一个对象数组,您只需要追加更新条件。

另请参见: Node.js中的PostgreSQL多行更新

如果列名不是事先知道的呢?

为此,请参阅pg-promise中的dynamic命名参数 ,并注意正确的答案取决于您打算如何转换此类列的types。

像这样的东西:

 map = {col1: "value1", col2: "value2",id:"existingId"}. db.none("UPDATE mytable SET col1=${col1}, col2=${col2} where id=${id}", map)