Odtwarzanie kopii Postgres bezpośrednio w Pythonie?
Mam blok danych, obecnie jako listę N-krotek, ale format jest dość elastyczny, który chciałbym dołączyć do tabeli Postgres - w tym przypadku każda N-krotka odpowiada wierszowi w DB.
To, co robiłem do tej pory, to zapisanie ich do pliku CSV, a następnie użycie kopii postgres' a do masowego załadowania tego wszystkiego do bazy danych. To działa, ale jest nieoptymalne, wolałbym być w stanie zrobić to wszystko bezpośrednio z Pythona. Czy istnieje metoda z Pythona do skopiować typ kopii w Postgres?
1 answers
Jeśli używasz sterownika psycopg2, Kursory zapewniają funkcje copy_to
i copy_from
, które mogą odczytywać z dowolnego obiektu podobnego do pliku (w tym bufora StringIO
).
W plikach są przykłady examples/copy_from.py i examples/copy_to.py które pochodzą z dystrybucji źródeł psycopg2 .
Ten fragment pochodzi z przykładu 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')
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-19 19:49:14