Node.js 用对象更新准备好的语句

Node.js 用对象更新准备好的语句,node.js,postgresql,pg-promise,Node.js,Postgresql,Pg Promise,我有一个对象,它将列名映射到值。要更新的列事先不知道,而是在运行时决定的 e、 g.map={col1:“value1”,col2:“value2”} 我想执行一个UPDATE查询,用这些列将表更新为相应的值。我能做以下事情吗?如果没有,是否有一种不需要手动构建查询的优雅方法 db.none('UPDATE mytable SET $1 WHERE id = 99', map) 大概是这样的: map = {col1: "value1", col2: "value2",id:"existing

我有一个
对象
,它将列名映射到值。要更新的列事先不知道,而是在运行时决定的

e、 g.
map={col1:“value1”,col2:“value2”}

我想执行一个
UPDATE
查询,用这些列将表更新为相应的值。我能做以下事情吗?如果没有,是否有一种不需要手动构建查询的优雅方法

db.none('UPDATE mytable SET $1 WHERE id = 99', map)
大概是这样的:

map = {col1: "value1", col2: "value2",id:"existingId"}.

db.none("UPDATE mytable SET col1=${col1}, col2=${col2} where id=${id}", map)
有没有一种不需要手动构建查询的优雅方法

db.none('UPDATE mytable SET $1 WHERE id = 99', map)
是的,有,通过使用for SQL生成

您可以像这样预先声明静态对象:

const cs = new pgp.helpers.ColumnSet(['col1', 'col2'], {table: 'mytable'});
然后像这样使用它,通过:

这种方法既适用于单个对象,也适用于对象数组,您只需相应地附加更新条件即可

另见:


如果列名事先不知道怎么办


为此,请参见:,请注意,正确的答案取决于您打算如何强制转换此类列的类型。

您需要提供一个id。
要更新的列事先不知道,而是在运行时决定的。
在这种情况下,您忘了指定您打算如何强制转换它们的SQL类型。@vitaly-t我不确定强制转换类型是什么意思。您能解释一下吗?@Code您在数据库中的列有一个特定的SQL类型,更新时需要遵循该类型。您没有提到它,这意味着不知道如何正确转义对象中的JavaScript属性。i、 e.
col1
col2
等的SQL类型是什么。。。?它们的JavaScript类型是什么?@vitaly-t每个列的类型都是已知的,插入的值将是数据库接受的适当类型。库将根据值本身的JavaScript类型自动执行任何转义,否?如果列名事先未知怎么办?(我刚刚编辑了我的帖子)@Code那么你打算怎么投他们的类型呢?