2009-12-08 11 views
17

Ich habe einen Datenblock, derzeit als eine Liste von n-Tupeln, aber das Format ist ziemlich flexibel, die ich an eine Postgres-Tabelle anhängen möchte - in diesem Fall entspricht jedes n-Tupel einer Zeile in der DB.Postgres COPY direkt in Python neu erstellen?

Was ich bis zu diesem Punkt gemacht habe, ist diese alle in eine CSV-Datei zu schreiben und dann COPY von Postgres zu verwenden, um alles in die Datenbank zu laden. Das funktioniert, ist aber suboptimal. Ich würde es vorziehen, alles direkt von Python aus tun zu können. Gibt es eine Methode innerhalb von Python, um die COPY-Typ-Massenlast in Postgres zu replizieren?

Antwort

45

Wenn Sie den psycopg2 Treiber verwenden, bieten die Cursor eine copy_to und copy_from Funktion, die aus einer beliebigen Datei-ähnliches Objekt (einschließlich eines StringIO Puffer) lesen kann.

Es gibt Beispiele in den Dateien examples/copy_from.py und examples/copy_to.py, die mit der psycopg2 source distribution kommen.

Dieser Auszug stammt aus dem copy_from.py Beispiel:

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

mir ein Vergnügen ... wenn es für Sie arbeitet, nicht zu vergessen die akzeptieren Taste für diese Antwort zu treffen. Ich habe bemerkt, dass Sie keine der Antworten auf Ihre anderen Fragen akzeptiert haben, aber das Häkchen "Akzeptieren" hilft anderen, die das gleiche Problem haben auf einen Blick, welche Antwort das Problem für Sie gelöst hat. –

+0

Sorry, ich hatte die Häkchen vorher nicht bemerkt :) – geoffjentry

+0

Bitte ändern Sie dies, um Booleans und Arrays einzubinden, da diese für mich nicht zu funktionieren scheinen! –

Verwandte Themen