2

我正在尝试使用 asyncpg 将大型 Pandas 数据帧写入 postgres,但在尝试使用 copy_to_table 函数时出现错误。

我有使用 psycopg2.copy_from 使用 StringIO 的工作代码,但是当我尝试使用 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 中 - 而不是逐行加载。

4

1 回答 1

2

我为自己把事情复杂化了。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)
于 2019-02-16T15:14:58.850 回答