2013-03-24 8 views
11

Sto riscontrando problemi nell'eseguire il comando di copia per caricare dati da S3 a Amazon's Redshift da python.
Ho il seguente comando di copia:Copia di dati da S3 a redshift di AWS usando python e 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 ','; 

Quando eseguire questo comando utilizzando SQL Workbench/j tutto funziona come previsto, ma quando provo ad eseguire questo con Python e psycopg2 il passaggio di comando OK, ma i dati non vengono caricato e non viene generato alcun errore.
provato le seguenti due opzioni (si presuppone il collegamento psycopg2 è OK perché è):

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

entrambi passano senza preavviso ancora dati non viene caricato

idee?

Grazie

+0

È necessario chiamare commit() dopo execute() altrimenti non sarà efficace. – ciphor

risposta

-6

La sintassi dovrebbe essere simile a istruzioni DDL

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

Ho usato questa configurazione esatta (psycopg2 + redshift + COPIA) con successo. Ti sei impegnato in seguito? Per impostazione predefinita, SQL Workbench esegue il commit automatico mentre psycopg2 esegue l'apertura di una transazione, pertanto i dati non saranno visibili finché non si chiama commit() sulla connessione.

Il flusso di lavoro completo è:

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

Non credo che copy_expert() o uno qualsiasi dei cursor.copy_ * comandi funzionano con Redshift.

+0

questo ha risolto il problema per me. Stavo cercando di utilizzare il mio framework sqlalchemy per eseguire il comando copy e non ho potuto ottenere il carico da impegnare. thread correlato qui: http://stackoverflow.com/questions/28271049/redshift-copy-operation-doesnt-work-in-sqlalchemy sfortunatamente la soluzione di commit automatico con sqlalchemy ha spiegato che non ha funzionato per me, ma quanto sopra con psycopg2 ha fatto –

+0

@Voket che è stato bloccato su execute per me e quindi non può eseguire conn.commit(). Eventuali suggerimenti? – Dnaiel

9

Innanzitutto, assicurarsi che la transazione sia confermata.

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

è possibile garantire una transazione-commit con i seguenti modo pure (garantendo liberando le risorse),

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

Quando una connessione esce dal con il blocco, se non fa eccezione è stata sollevata dal blocco , la transazione è commessa. In caso di eccezione, la transazione viene ripristinata.

In secondo luogo, anche il commit non aiuta quando i dati da caricare impiegano molto tempo e superano connect_timeout (e non possono eseguire il commit). Quindi, quando il commit esplicito non aiuta, prova con un timeout aumentato.

Problemi correlati