用pg-promise插入多个logging

我有一个场景,我需要插入多个logging。 我有一个表结构,如ID(这是从其他表fk),键(字符),值(字符)。 需要保存的input是上述数据的数组。 例如:我有一些数组对象,如:

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

在MS SQL中,我将创buildTVP并通过它。 我不知道如何在postgres中实现。 所以现在我想要做的就是使用pg-promise库在postgres sql的单个查询中保存列表中的所有项目。 我无法从文档中find任何文档/理解。 任何帮助赞赏。 谢谢。

       

网上收集的解决方案 "用pg-promise插入多个logging"

我是pg-promise的作者。

有两种方法可以插入多个logging。 第一种,也是最典型的方式是通过一个事务来确保所有的logging都被正确地插入,或者没有一个是正确的。

有了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 }); 

您使用方法tx启动事务,然后创build所有INSERT查询承诺,然后将其全部解决为批处理 。

第二种方法是将所有插入值连接成一个INSERT查询,我将在Performance Boost中详细解释。 另请参阅: 使用pg-promise的多行插入 。

有关更多示例,请参阅任务和事务 。

加成

值得指出的是,在大多数情况下,我们不插入loggingid ,而是自动生成。 有时我们想要得到新的id-s,而在其他情况下,我们不在乎。

上面的例子用一个null -s数组来parsing,因为批处理以一个单独的结果数组来parsing,方法none根据它的API来parsing为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 }); 

即变化是:

  • 我们不插入id
  • 我们用一个replace方法none ,从每个插入中获得一行/对象
  • 我们将RETURNING id追加到查询中以获取值
  • 我们添加a => +a.id来做自动行转换。 另请参见pg-promise将整数作为string来理解“ +含义。

UPDATE-1

对于通过单个INSERT查询的高性能方法,请参阅使用pg-promise的多行插入 。

UPDATE-2

一篇必读的文章: 数据导入 。