更新多个列和值节点发布



使用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 允许您基于准备好的语句创建查询。(这建立在原生 pg-sql 预准备语句的基础上(。

    postgres 建议使用这些选项来填充表,作为使用其copy命令的辅助选项。你最终会做更多的SQL语句(可能每行一个(,但预准备语句的优点应该在某种程度上抵消这一点。

    您还可以将其与交易相结合,在上面的 postgres "填充"链接中也提到过。

     

  • 另一种选择是另一个称为 pg-promise 的库(特别是助手(采用的方法。pg-promise 帮助程序库从字面上为批量插入/更新语句构建 sql 语句(作为字符串(。这样,您就可以使用单个语句一次更新/插入数千行。

     

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

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

     

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

注2:值得注意的是,pg-promise 编写了自己的 SQL 注入保护(通过转义值中的单引号和表/列名中的双引号(。第三种选择也需要这样做。而预准备语句本身对 sql 注入进行本机保护。

最新更新