用asyncpg插入多行的最佳方法

2024-04-26 05:36:15 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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循环中使用准备好的语句

^{pr2}$

如果有700000行,我必须选择100x次的方式,或者有某种方法可以组合这些方法? 我完全是绿色的,所以给我扔些西红柿


Tags: 方法idsqldatetitlecodeprodinsert
3条回答

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

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,必须显式指定每个插入的值。在

一次插入多行的另一种方法是使用copy_records_to_table方法。在

data = [
    ("row", 1, "some data"),
    ("row", 2, "more data"),
]
await conn.copy_records_to_table('mytable', records=data)

asyncpg提供^{}方法来插入许多行。在

statement = """INSERT INTO films (code,
                           title, 
                           did, 
                           date_prod, 
                           kind) VALUES($1, $2, $3, $4, $5);"""
await connection.executemany(statement, values)

如果您需要使用RETURNING来返回插入的id,那么answer就是最好的选择。在

相关问题 更多 >

    热门问题