如何使用asyncpg.copy_to_table和Pandas Dataframe?

4
我想使用asyncpg将一个大的Pandas数据框写入到Postgres中,但是在使用copy_to_table函数时出现了错误。我已经有了使用StringIO的psycopg2.copy_from的可行代码,但是当我尝试使用类似的模式来实现异步pg时它并不起作用。使用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个回答

3

我一直在为自己制造麻烦。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)

s = await conn.copy_records_to_table(table_name, records=df.itertuples(index=False), columns=df.columns.to_list(), timeout=10) 可能更简洁。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接