Как использовать asyncpg.copy_to_table с Pandas Dataframe
Я пытаюсь написать большой файл данных Pandas для postgres с помощью asyncpg, но получаю ошибки при попытке сделать это с помощью функции 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'
Я также попытался загрузить dataframe в объект 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 для загрузки большого фрейма данных в postgres с помощью команды COPY, а не строка за строкой.
1 ответ
Я был слишком сложным для себя. 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)