如何在Pandas Dataframe中使用asyncpg.copy_to_table

时间:2019-02-16 14:24:54

标签: python pandas asyncpg

我正在尝试使用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中,而不是逐行。

1 个答案:

答案 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)