Воссоздание Postgres COPY прямо в Python?
У меня есть блок данных, в настоящее время в виде списка из n-кортежей, но формат довольно гибкий, который я хотел бы добавить в таблицу Postgres - в этом случае каждый n-кортеж соответствует строке в БД.
До этого момента я писал все это в CSV-файл, а затем использовал COPY postgres для массовой загрузки всего этого в базу данных. Это работает, но неоптимально, я бы предпочел сделать все это прямо из Python. Есть ли внутри Python метод для репликации массовой загрузки типа COPY в Postgres?
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')