带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,请参阅数据导入 。