首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用pg-promise插入多条记录

使用pg-promise插入多条记录
EN

Stack Overflow用户
提问于 2016-03-26 17:13:43
回答 1查看 13.7K关注 0票数 25

我有一个需要插入多条记录的场景。我有一个类似id (来自其他表的fk ),key(char),value(char)的表结构。需要保存的输入将是上述数据的数组。例如:我有一些数组对象,比如:

代码语言:javascript
复制
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中,我会创建TVP并传递它。我不知道如何在postgres中实现。因此,现在我想要做的是使用pg-promise库在postgres sql中的单个查询中保存列表中的所有项目。我无法从文档中找到任何文档/理解。感谢您的帮助。谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-26 18:35:19

我是pg-promise的作者。

有两种方法可以插入多条记录。第一种,也是最典型的方法是通过事务,以确保正确插入所有记录,或者没有插入任何记录。

pg-promise中,它是通过以下方式完成的:

代码语言:javascript
复制
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启动一个事务,然后创建所有INSERT查询promises,然后将它们作为batch进行解析。

第二种方法是将所有insert值连接到一个INSERT查询中,我将在Performance Boost中对此进行详细说明。另请参阅:Multi-row insert with pg-promise

有关更多示例,请参阅TasksTransactions

添加

值得指出的是,在大多数情况下,我们不会插入记录id,而是让它自动生成。有时我们想要找回新的id-s,而在其他情况下我们并不关心。

上面的示例使用null-s数组进行解析,因为batch使用单个结果的数组进行解析,而方法none根据其API使用null进行解析。

让我们假设我们想要生成新的id-s,并且我们想要把它们都取回来。为此,我们将代码更改为以下代码:

代码语言:javascript
复制
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值,我们将方法none替换为one,要从每个插入
  • 中获得一行/对象,我们将RETURNING id附加到查询以获得值
  • 我们添加a => +a.id来执行自动行转换。另请参阅pg-promise returns integers as strings以了解该+的用途。

更新-1

有关通过单个INSERT查询实现的高性能方法,请参阅Multi-row insert with pg-promise

更新-2

必读文章:Data Imports

票数 45
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36233566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档