Подтвердить что ты не робот

Воспроизведение Postgres COPY непосредственно в Python?

У меня есть блок данных, в настоящее время в виде списка n-кортежей, но формат довольно гибкий, что я хотел бы добавить в таблицу Postgres - в этом случае каждый n-кортеж соответствует строке в БД.

То, что я делал до этого момента, это записать все это в файл CSV, а затем использовать COPY для постгрейса для загрузки всего этого в базу данных. Это работает, но является субоптимальным, я бы предпочел иметь возможность делать все это прямо из python. Есть ли способ изнутри python для тиражирования массовой загрузки типа COPY в Postgres?

4b9b3361

Ответ 1

Если вы используете драйвер psycopg2, курсоры предоставляют функцию copy_to и copy_from, которая может считываться из любого файлового объекта (включая буфер StringIO).

В файлах есть примеры examples/copy_from.py и examples/copy_to.py, которые поставляются с дистрибутив psycopg2.

Этот отрывок из примера copy_from.py:

conn = psycopg2.connect(DSN)
curs = conn.cursor()
curs.execute("CREATE TABLE test_copy (fld1 text, fld2 text, fld3 int4)")

# anything can be used as a file if it has .read() and .readline() methods
data = StringIO.StringIO()
data.write('\n'.join(['Tom\tJenkins\t37',
                  'Madonna\t\N\t45',
                  'Federico\tDi Gregorio\t\N']))
data.seek(0)

curs.copy_from(data, 'test_copy')