我正在尝试使用asyncpg将大型的Pandas数据帧写入postgres,但是在尝试使用copy_to_table函数时遇到错误。
我有使用StringIO的psycopg2.copy_from的有效代码,但是当我尝试使用asyncpg实现类似模式时它不起作用
使用StringIO
sio = StringIO(df.to_csv(index=None, header=None))
sio.seek(0)
async with pg_pool.acquire() as conn:
async with conn.transaction():
s = await conn.copy_to_table('tmp_table', source=sio, columns=list(df.columns), delimiter=',')
这是我使用StringIO时遇到的错误:
Exception: memoryview: a bytes-like object is required, not 'str'
我也尝试将数据帧加载到BytesIO对象中,但是与to_csv却遇到了另一个问题:
bio = BytesIO(df.to_csv(index=None, header=None))
bio.seek(0)
TypeError: a bytes-like object is required, not 'str'
我很确定我在这里将数据帧转换为错误的字节。无论哪种方式,我都只想使用asyncpg通过COPY命令将大型数据帧加载到postgres中,而不是逐行。
答案 0 :(得分:0)
我为自己做的事情太复杂了。 copy_records_to_table有效-只需将数据转换为元组即可。
tuples = [tuple(x) for x in df.values]
s = await conn.copy_records_to_table(table_name, records=tuples, columns=list(df.columns), timeout=10)