Как использовать 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)
Другие вопросы по тегам