我有一个需要插入多条记录的场景.我有一个表 struct ,比如id(它是来自其他表的fk)、key(char)、value(char).需要保存的输入将是上述数据的array.例子:

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并通过它.我不知道如何在博士后取得成功.

推荐答案

我是《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
    });

使用方法tx启动一个事务,然后创建所有INSERT个查询promise ,然后将它们全部解析为batch.

第二种方法是将所有插入值连接到一个INSERT查询中,我将在Performance Boost中详细解释.另见:Multi-row insert with pg-promise.

更多示例请参见TasksTransactions.

Addition

值得指出的是,在大多数情况下,我们不会插入记录id,而是自动生成它.有时我们想拿回新的身份证,而在其他情况下我们不在乎.

根据API,上面的示例使用null-s数组进行解析,因为batch使用单个结果数组进行解析,而方法none使用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
    });

i、 e.这些变化是:

  • 我们不插入id个值
  • 我们将方法none替换为one,从每个插入中获得一行/对象
  • 我们将RETURNING id追加到查询中以获取值
  • 我们添加a => +a.id来进行自动行转换.参见pg-promise returns integers as strings,了解+的用途.

UPDATE-1

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

UPDATE-2

必读文章:Data Imports篇.

Postgresql相关问答推荐

Postgres 13.8 -如何在对数据执行窗口操作时返回所有行

如何在PostgreSQL中对深度嵌套的jsonb属性创建索引

为什么我的应用程序接收的是空值而不是布尔值?

在特定值的组聚合中添加标签列作为结果

在 Windows 上使用 rsync 进行 Postgresql 副本升级

从单选插入到多个表

AGE Graph 实际上存储为 postgreSQL 表,对吧?如何检索该表(不是图表)?

为什么 postgresql 可以在这个查询中高效地使用索引?

使用 ON CONFLICT 从 INSERT 返回行,无需更新

如何使用 pg_dump 或 psql 从 *.sql 恢复 PostgreSQL 表?

Postgres 中的相似函数与 pg_trgm

避免 created_at 和 updated_at 由 sequelize 自动生成

从没有行的计数中获取 0 值

我怎样才能知道 Postgresql 表空间中有什么?

在 Windows 10 中执行时,Docker 容器关闭并给出data directory has wrong ownership错误

Windows 上的 GeoDjango:Could not find the GDAL library" / "OSError: [WinError 126] The specified module could not be found

PostgreSQL 中跨多个表的索引

如何在postgresql中编写关于最大行数的约束?

如何将 CSV 数据插入 PostgreSQL 数据库(远程数据库)

pgadmin 错误:no password supplied