当前位置: 首页 > 知识库问答 >
问题:

使用Object更新准备好的语句

齐驰
2023-03-14

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

例如< code>map = {col1: "value1 ",col2: "value2"}。

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

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

共有2个答案

水浩歌
2023-03-14

类似这样:

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

db.none("UPDATE mytable SET col1=${col1}, col2=${col2} where id=${id}", map)
穆宾白
2023-03-14

有没有一种优雅的方法可以不用手动构建查询?

是的,有,通过使用SQL一代的助手。

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

const cs = new pgp.helpers.ColumnSet(['col1', 'col2'], {table: 'mytable'});

然后像这样使用它,通过助手.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中的动态命名参数,并注意,正确的答案取决于您打算如何转换此类列的类型。

 类似资料:
  • 我试图将预准备语句与跨表更新结合使用。我已经准备了一个代表我们更大数据库的示例脚本。这第一部分做我想要的没有准备好的语句,但我希望避免复制/粘贴我的数据的每一列。 这就是为什么我尝试了这样的东西作为更新函数的替代品。然而,我经常收到语法错误报告。有人能指出我哪里出错了吗?这将是非常感谢!

  • 问题内容: 我试图用大约50,000行10列填充Java中的resultSet,然后使用的方法将它们插入到另一个表中。 为了使过程更快,我进行了一些研究,发现在将数据读入resultSet时,fetchSize起着重要的作用。 如果fetchSize太低,可能会导致到服务器的行程过多,而fetchSize太高则会阻塞网络资源,因此我做了一些尝试,并设置了适合我的基础结构的最佳大小。 我正在阅读此r

  • 问题内容: 我已经使用prepared语句将订单插入到订单表中,但是现在我想根据订单表中插入的最后一个ID将订单项插入到订单表中: 等同于使用准备好的语句? 问题答案: 如果您使用的是PDO,则为。因此,如果您的数据库句柄称为: 如果您使用的是MySQLi,则为或:

  • 我有以下准备的一个准备好的声明失败了... 我在我的第一份准备好的声明中几乎有同样的准备,而且它进行得很好。我不确定是否我有两个准备好的声明,如果这是造成一个问题,或情况可能是什么? 现在我有个错误... 更新-可能的内部连接,像这样?