更新多个列和值节点postgres

时间:2018-06-22 20:50:22

标签: node.js postgresql

我要使用 if($(this).hasClass("home")) { $("body").addClass("home"); } else if($(this).hasClass("tasks")) { $("body").addClass("tasks"); } else if($(this).hasClass("roadmap")) { $("body").addClass("roadmap"); } else if($(this).hasClass("staff")) { $("body").addClass("staff"); } else if($(this).hasClass("timesheet")) { $("body").addClass("timesheet"); } else if($(this).hasClass("global-tasks")) { $("body").addClass("global-tasks"); } else if($(this).hasClass("deleted-tasks")) { $("body").addClass("deleted-tasks"); } 更新用户模型中的列,目前我已经拥有了

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]);
}

但是,如果我想更新多个列和值,则此刻我的工作效率很低,并且将该方法调用x次(即每个查询)

await  update_user_by_email(value, column_name, email_address);

如何仅通过一次调用数据库就可以生成它。

谢谢

1 个答案:

答案 0 :(得分: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_schema tables和{{1}中提取结构数据,也可以(相对容易)自定义构建自己的sql helper或补充pg-promise。 }}表。

    关于pg-promise的更繁琐的事情之一是必须为其提供所有列名(有时还包括定义,默认值等),如果您正在处理数十个或数百个单独的表,则会自动生成直接从数据库本身获取的信息可能更简单,更可靠(您不必在每次更改数据库时都更新列名数组)

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

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