2009-12-08 9 views
17

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-tka odpowiada wierszowi w DB.Odtwarzanie Postgres COPY bezpośrednio w Pythonie?

Do tej pory robiłem to wszystko, pisząc te pliki do pliku CSV, a następnie za pomocą KOPII postgreSQL ładowałem wszystkie te dane do bazy danych. Działa to, ale jest nieoptymalny, wolałbym móc to zrobić bezpośrednio z Pythona. Czy istnieje metoda z Pythona, aby zreplikować ładowanie zbiorcze typu COPY w PostgreSQL?

Odpowiedz

45

Jeśli używasz sterownika psycopg2, kursory udostępniają funkcję copy_to i copy_from, która może odczytywać z dowolnego obiektu podobnego do pliku (w tym z bufora StringIO).

Istnieją przykłady w plikach examples/copy_from.py i examples/copy_to.py, które pochodzą z psycopg2 source distribution.

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') 
+2

Mam przyjemność ... czy to działa dla Ciebie, nie zapomnij nacisnąć przycisk akceptacji dla tej odpowiedzi. Zauważyłem, że nie zaakceptowałeś żadnej z odpowiedzi na inne pytania, ale znacznik "zaakceptuj" pomaga innym, którzy mają ten sam problem, wiedzieć na pierwszy rzut oka, która odpowiedź rozwiązała problem. –

+0

Niestety, jeszcze nie zauważyłem znaków kontrolnych przed :) – geoffjentry

+0

Zmodyfikuj to, aby uwzględnić booleany i tablice, ponieważ te wydają się nie działać dla mnie! –