【问题标题】:Update multiple columns and values node postgres更新多个列和值节点 postgres
【发布时间】:2023-03-10 12:55:01
【问题描述】:

使用node-postgres我想更新我的用户模型中的列,目前我有这个

async function update_user_by_email(value, column, email){
  const sql = format('UPDATE users SET %I = $1,  WHERE email = $2', column);
  await pool.query(sql, [value, email]);
}

所以我可以这样做

await  update_user_by_email(value, column_name, email_address);

但是,如果我想更新多个列和值,我目前正在做一些非常低效的事情并调用该方法 x 次(即对于每个查询)

await update_user_by_email(value, column_name, email_address);
await update_user_by_email(value_2, column_name_2, email_address);
await update_user_by_email(value_3, column_name_3, email_address);

我怎样才能通过一次调用数据库来生成它。

谢谢

【问题讨论】:

标签: node.js postgresql


【解决方案1】:

你有几个选择:

  • node-postgres 允许您创建queries based on prepared statements。 (这建立在本机 pg-sql prepared statements 之上)。

    这些是recommended by postgres for populating a table,作为使用copy 命令的次要选项。你最终会做更多的 SQL 语句(可能每行一个),但是准备好的语句的优点应该在一定程度上抵消了这一点。

    您也可以将其与transactions 结合使用,上面的 postgres“填充”链接中也提到过。

     

  • 另一个选项是另一个名为pg-promise (specifically helpers) 的库所采用的方法。 pg-promise 帮助程序库实际上为批量插入/更新语句构建 sql 语句(作为字符串)。这样,您可以使用一条语句一次更新/插入数千行。

     

  • 通过直接从information_schematablescolumns 表中提取结构数据,也可以(并且相对容易)自定义构建自己的 sql 助手,或补充 pg-promise。

    关于 pg-promise 的一个更乏味的事情是必须给它所有的列名(有时还有定义、默认值等),如果你正在处理数十个或数百个单独的表,自动生成直接来自数据库本身的这些信息可能更简单、更健壮(每次更改数据库时都不必更新列名数组)

     

注意:您不需要使用 pg-promise 提交由其帮助程序库生成的查询。就个人而言,我更喜欢 node-postgres 用于实际的数据库通信,并且通常只使用 pg-promise 帮助程序库来构建那些批量 SQL 语句。

NOTE2:值得注意的是 pg-promise 编写了自己的 SQL 注入保护(通过转义值中的单引号和表/列名中的双引号)。在第三个选项中也需要这样做。而准备好的语句本身就受到数据库服务器本身的 sql 注入保护。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-27
    • 1970-01-01
    • 2019-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多