0sv*_*sv4 6 python postgresql python-asyncio asyncpg
我想插入多行并使用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;
Run Code Online (Sandbox Code Playgroud)
2:在for循环中使用prepared语句
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)
Run Code Online (Sandbox Code Playgroud)
哪种方式我必须更喜欢100x次700,000行,或者有一些方法来结合这些方法?我完全是绿色的,所以在我身上扔一些烤肉
Tha*_*all 10
一次插入多行的另一种方法(假设您不需要插入的 ID)是使用该copy_records_to_table方法。
data = [
("row", 1, "some data"),
("row", 2, "more data"),
]
await conn.copy_records_to_table('mytable', records=data)
Run Code Online (Sandbox Code Playgroud)
如果需要使用该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')
])
Run Code Online (Sandbox Code Playgroud)
请注意,作为输入传递的记录必须与表的形状相对应:PostgreSQL不支持任意记录作为输入,因此您必须使用已知的记录类型.只需传递未插入的列,None并且不要将它们包含在SELECT返回列表中.此方法也不允许您依赖DEFAULT,您必须明确指定每个插入的值.
asyncpg提供executemany插入多行的方法.
statement = """INSERT INTO films (code,
title,
did,
date_prod,
kind) VALUES($1, $2, $3, $4, $5);"""
await connection.executemany(statement, values)
Run Code Online (Sandbox Code Playgroud)
如果您需要使用RETURNING后面提到的返回插入的ID,那么这个答案是要走的路.
| 归档时间: |
|
| 查看次数: |
3820 次 |
| 最近记录: |