Man*_*ndy 20 postgresql node.js pg-promise
我有一个场景,我需要插入多个记录.我有一个像id(它是来自其他表的fk),key(char),value(char)的表结构.需要保存的输入将是上述数据的数组.示例:我有一些数组对象,如:
lst = [];
obj = {};
obj.id= 123;
obj.key = 'somekey';
obj.value = '1234';
lst.push(obj);
obj = {};
obj.id= 123;
obj.key = 'somekey1';
obj.value = '12345';
lst.push(obj);Run Code Online (Sandbox Code Playgroud)
在MS SQL中,我会创建TVP并通过它.我不知道如何在postgres中实现.所以我现在要做的是使用pg-promise库在postgres sql的单个查询中保存列表中的所有项目.我无法从文档中找到任何文档/理解.任何帮助赞赏.谢谢.
vit*_*y-t 32
我是pg-promise的作者.
插入多个记录有两种方法.第一种也是最典型的方式是通过事务来确保所有记录都正确插入,或者都不是.
使用pg-promise,它可以通过以下方式完成:
db.tx(t => {
const queries = lst.map(l => {
return t.none('INSERT INTO table(id, key, value) VALUES(${id}, ${key}, ${value})', l);
});
return t.batch(queries);
})
.then(data => {
// SUCCESS
// data = array of null-s
})
.catch(error => {
// ERROR
});
Run Code Online (Sandbox Code Playgroud)
使用方法tx启动事务,然后创建所有INSERT查询承诺,然后将它们全部作为批处理解析.
第二种方法是将所有插入值连接到一个INSERT查询中,我将在Performance Boost中详细解释.另请参见:带有pg-promise的多行插入.
加成
值得指出的是,在大多数情况下,我们不会插入记录id,而是自动生成记录.有时候我们希望得到新的id-s,而在其他情况下我们并不关心.
上面的示例使用null-s 数组解析,因为批处理解析具有单个结果的数组,并且根据其API ,方法无解析null.
让我们假设我们想要生成新的id-s,并且我们希望将它们全部取回.为此,我们将代码更改为以下内容:
db.tx(t => {
const queries = lst.map(l => {
return t.one('INSERT INTO table(key, value) VALUES(${key}, ${value}) RETURNING id',
l, a => +a.id);
});
return t.batch(queries);
})
.then(data => {
// SUCCESS
// data = array of new id-s;
})
.catch(error => {
// ERROR
});
Run Code Online (Sandbox Code Playgroud)
即变化是:
id值RETURNING id到查询以获取值a => +a.id自动行转换.另请参见pg-promise将整数作为字符串返回以了解其+用途.UPDATE-1
对于通过单个INSERT查询的高性能方法,请参阅带有pg-promise的多行插入.
UPDATE-2
必读文章:数据导入.
| 归档时间: |
|
| 查看次数: |
9170 次 |
| 最近记录: |