使用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)