node.js - 更新多个列和值 Node postgres

标签 node.js postgresql

使用 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-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_schema 中提取结构数据,也可以(并且相对容易)自定义构建您自己的 sql 助手,或补充 pg-promise。 tablescolumns表。

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

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

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

关于node.js - 更新多个列和值 Node postgres,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50995419/

相关文章:

node.js - 使用 Node/Express 构建企业应用

postgresql - PostGIS中栅格分辨率较低

macos - Postgresql 安装 : command not found: createdb, psql

javascript - 使用 Node.js 验证 DDP 客户端

javascript - Selenium NodeJS 打印 cookie 到控制台

sql - 在 PostgreSQL 中执行这个小时的操作查询

sql - PostgreSQL 中数据库触发器的执行上下文

xml - 如何从 postgresql 函数中的 xml 中读取数据?

javascript - 如何将文件名设置为与数据库中的对象 ID 相同?

javascript - ES6 类并扩展内置 Buffer