使用 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。tables
和columns
表。关于 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/