2013-03-24 11 views
11

Ich habe Probleme beim Ausführen des Befehls kopieren, um Daten von S3 zu Amazon Redshift von Python zu laden.
ich folgenden Kopierbefehl habe:Kopieren von Daten von S3 zu AWS redshift mit Python und psycopg2

copy moves from 's3://<my_bucket_name>/moves_data/2013-03-24/18/moves' 
credentials 'aws_access_key_id=<key_id>;aws_secret_access_key=<key_secret>' 
removequotes 
delimiter ','; 

Wenn ich diesen Befehl ausführen jedoch mit SQL Workbench/j alles wie erwartet funktioniert, wenn ich versuche, dies mit Python ausführen und den Befehl Pass OK, aber keine Daten psycopg2 ist geladen und kein Fehler wird ausgelöst.
versuchten die beiden folgenden Optionen (nehmen psycopg2 Verbindung ist in Ordnung, weil es):

cursor.execute(copy_command) 
cursor.copy_expert(copy_command, sys.stdout) 

beide ohne Vorwarnung passieren noch die Daten nicht

Ideen geladen?

Dank

+0

Sie müssen commit() nach execute() aufrufen, sonst wird es nicht wirksam. – ciphor

Antwort

-6

Die Syntax sollte erfolgreich zu DDL-Anweisungen

# Create table 
c.execute('''CREATE TABLE stocks 
      (date text, trans text, symbol text, qty real, price real)''') 
22

ich verwendet habe genau dieses Setup (psycopg2 + Rotverschiebung + COPY) ähnlich sein. Hast du dich danach verpflichtet? SQL Workbench wird standardmäßig automatisch commit, während psycopg2 standardmäßig eine Transaktion öffnet. Daher sind die Daten erst sichtbar, wenn Sie commit() für Ihre Verbindung aufrufen.

Der vollständige Workflow ist:

conn = psycopg2.connect(...) 
cur = conn.cursor() 
cur.execute("COPY...") 
conn.commit() 

Ich glaube nicht, dass copy_expert() oder einen der cursor.copy_ * Befehle mit Redshift arbeiten.

+0

das löste das Problem für mich. Ich habe versucht, mein sqlalchemy-Framework zu verwenden, um den Kopierbefehl auszuführen, und ich konnte die Last nicht zum Festschreiben bekommen. verwandten Thread hier: http://stackoverflow.com/questions/28271049/redshift-copy-operation-doesnt-work-in-sqlalchemy leider die Auto-Commit-Lösung mit Sqlalchemy erklärte, dass es nicht für mich funktioniert, aber die oben genannten mit psycopg2 hat –

+0

@Voket es ist auf steckte für mich ausführen ausgeführt und kann dann nicht die conn.commit() ausführen. Irgendwelche Vorschläge? – Dnaiel

9

Zuerst sicherstellen, dass die Transaktion festgeschrieben ist.

conn = psycopg2.connect(conn_string) 
cur = conn.cursor() 
cur.execute(copy_cmd_str) 
conn.commit() 

können Sie eine Transaktion-commit mit folgenden Art und Weise sowie (Sicherstellung der Ressourcen freigegeben werden) gewährleisten,

with psycopg2.connect(conn_string) as conn: 
    with conn.cursor() as curs: 
     curs.execute(copy_cmd_str) 

Wenn eine Verbindung der mit Block verlässt, wenn keine Ausnahme durch den Block angehoben wurde ist die Transaktion festgeschrieben. Im Ausnahmefall wird die Transaktion zurückgesetzt.

Zweitens macht auch commit nicht hilft, wenn die Daten geladen werden dauert einige Zeit und überschreitet connect_timeout (und kann nicht commit). Wenn das explizite Commit nicht hilft, versuchen Sie es mit einem erhöhten Timeout.

Verwandte Themen