带pg-promise的多行插入

我想用一个INSERT查询插入多行,例如:

 INSERT INTO tmp(col_a,col_b) VALUES('a1','b1'),('a2','b2')... 

有没有办法很容易做到这一点,最好是像这样的对象数组:

 [{col_a:'a1',col_b:'b1'},{col_a:'a2',col_b:'b2'}] 

我可能会在一个块中产生500条logging,所以运行多个查询将是不可取的。

到目前为止,我已经能够只为一个单一的对象:

 INSERT INTO tmp(col_a,col_b) VALUES(${col_a},${col_b}) 

作为一个侧面的问题:插入使用${}符号保护反对SQL注入?

我是pg-promise的作者。

在较旧版本的库中, Performance Boost文章中的简化示例涵盖了这一点,在编写高性能数据库应用程序时,这仍然是一个重要的阅读。

更新的方法是依赖最终灵活的助手名称空间 ,并对性能进行高度优化。

 const pgp = require('pg-promise')({ /* initialization options */ capSQL: true // capitalize all generated SQL }); const db = pgp(/*connection*/); // our set of columns, to be created only once, and then shared/reused, // to let it cache up its formatting templates for high performance: const cs = new pgp.helpers.ColumnSet(['col_a', 'col_b'], {table: 'tmp'}); // data input values: const values = [{col_a: 'a1', col_b: 'b1'}, {col_a: 'a2', col_b: 'b2'}]; // generating a multi-row insert query: const query = pgp.helpers.insert(values, cs); //=> INSERT INTO "tmp"("col_a","col_b") VALUES('a1','b1'),('a2','b2') // executing the query: db.none(query) .then(data => { // success; }) .catch(error => { // error; }); 

请参阅API: ColumnSet , 插入 。

这样的插入甚至不需要事务,因为如果一组值无法插入,则不会插入。

您可以使用相同的方法来生成以下任何查询:

  • 单行INSERT
  • 多行INSERT
  • 单行UPDATE
  • 多行UPDATE

插入使用$ {}符号保护反对SQL注入?

是的,但并不孤单。 如果您要dynamic插入模式/表/列名称,使用SQL名称是很重要的,这些名称组合起来将保护您的代码免受SQL注入攻击。


相关问题: Node.js中的PostgreSQL多行更新


演员

问:如何同时获得每个新logging的id

答:只需将RETURNING id附加到查询中,然后用方法执行它即可:

 const query = pgp.helpers.insert(values, cs) + 'RETURNING id'; db.many(query) .then(data => { // data = [{id: 1}, {id: 2}, ...] }) .catch(error => { // error; }); 

甚至更好,得到的ID – S,并将结果转换为整数数组,使用方法图 :

 db.map(query, [], a => +a.id) .then(data => { // data = [1, 2, ...] }) .catch(error => { // error; }); 

要理解我们为什么使用+ ,请参阅: pg-promise将整数作为string返回 。

UPDATE

要插入大量的logging,请参阅数据导入 。