首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用asyncpg插入多行的最佳方式

使用asyncpg插入多行的最佳方式
EN

Stack Overflow用户
提问于 2017-05-02 21:27:10
回答 3查看 11.5K关注 0票数 16

我想用asyncpg插入多行并获取i,我找到了两种方法: 1:像这样生成sql

代码语言:javascript
复制
INSERT INTO films (code, title, did, date_prod, kind) VALUES
    ('B6717', 'Tampopo', 110, '1985-02-10', 'Comedy'),
    ('HG120', 'The Dinner Game', 140, DEFAULT, 'Comedy')
RETURNING id;

2:在for循环中使用预准备语句

代码语言:javascript
复制
values =(('B6717', 'Tampopo', 110, '1985-02-10', 'Comedy'),
        ('HG120', 'The Dinner Game', 140, DEFAULT, 'Comedy'))
stmnt = connection.prepare("INSERT INTO films (code, title, did, date_prod, kind) VALUES $1, $2, $3, $4, $5  RETURNING id")
for val in values:
    stmnt.fetchval(*val)

在100x倍的情况下,我必须选择哪种方法来处理70万行数据,或者有一些方法可以组合这些方法?我完全是菜鸟,所以给我扔点西红柿

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-05-12 21:54:08

如果需要使用RETURNING子句重新获取is,则以下是插入多个值的最有效方法:

代码语言:javascript
复制
res = await conn.fetch('''
    INSERT INTO films (code, title, did, date_prod, kind)
    (SELECT
        r.code, r.title, r.did, r.date_prod, r.kind
     FROM
        unnest($1::films[]) as r
    )
    RETURNING id
''', [
    (None, 'B6717', 'Tampopo', 110, '1985-02-10', 'Comedy'),
    (None, 'HG120', 'The Dinner Game', 140, None, 'Comedy')
])

注意,作为输入传递的记录必须对应于表的形状: PostgreSQL不支持将任意记录作为输入,因此必须使用已知的记录类型。只需将未插入的列作为None传递,并且不要将它们包含在SELECT返回列表中。此方法也不允许您依赖DEFAULT,您必须显式指定每个插入的值。

票数 13
EN

Stack Overflow用户

发布于 2017-05-04 18:15:19

asyncpg提供了executemany方法来插入许多行。

代码语言:javascript
复制
statement = """INSERT INTO films (code,
                           title, 
                           did, 
                           date_prod, 
                           kind) VALUES($1, $2, $3, $4, $5);"""
await connection.executemany(statement, values)

如果需要使用稍后提到的RETURNING来返回插入的ids,则可以使用此answer

票数 14
EN

Stack Overflow用户

发布于 2019-04-19 03:00:36

一次插入多行的另一种方法(假设不需要插入的is )是使用copy_records_to_table方法。

代码语言:javascript
复制
data = [
    ("row", 1, "some data"),
    ("row", 2, "more data"),
]
await conn.copy_records_to_table('mytable', records=data)
票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43739123

复制
相关文章

相似问题

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