2017-08-18 90 views
1

我試圖推動(與複製)從s3到Redshift的大文件。我在Python中使用sqlalchemy來執行sql命令,但它看起來副本只有當我初步截斷表時才起作用。複製數據從S3到RedShift在python(sqlalchemy)

連接工作正常:

from sqlalchemy import create_engine 
engine = create_engine('postgresql://XXXX:[email protected]:XXXX/XXXX') 

用這個命令字符串(如果我截斷COPY命令之前表)

toRedshift = "TRUNCATE TABLE public.my_table; COPY public.my_table from 's3://XXXX/part-p.csv' CREDENTIALS 'aws_access_key_id=AAAAAAA;aws_secret_access_key=BBBBBBB' gzip removequotes IGNOREHEADER 0 delimiter '|';" 
engine.execute(toRedshift) 

如果我刪除了 「截斷表public.my_table;」位

toRedshift = "COPY public.my_table from 's3://XXXX/part-p.csv' CREDENTIALS 'aws_access_key_id=AAAAAAA;aws_secret_access_key=BBBBBBB' gzip removequotes IGNOREHEADER 0 delimiter '|';" 
engine.execute(toRedshift) 

,但完全與任何其他SQL客戶端(如DBeaver例​​如)命令的工作

+1

很肯定這歸結爲[如何自動提交作品(http://docs.sqlalchemy.org/en/latest/core/connections.html#understanding-autocommit),但還不確定如何,或者如果有的話。 AUTOCOMMIT_REGEXP模式中沒有列出TRUNCATE和COPY。嘗試在'text(stmt).execution_options(autocommit = True)'構造中包裝你的''COPY ...''語句並將其傳遞給'engine.execute()'。 –

+0

engine.execute(text(stmt).execution_options(autocommit = True)) – user3620915

回答

0

謝謝ILJA。使用這個命令它的工作原理:

engine.execute(text(toRedshift).execution_options(autocommit=True)) 

我不知道爲什麼我能夠推動與字符串前面的TRUNCATE位的數據。

伊萬

+0

對於未知的原因,它會觸發自動提交(或者看起來似乎),但正如我之前所說的,至少當前的Postgresql正則表達式模式沒有TRUNCATE:https://github.com/zzzeek/sqlalchemy/blob/master/lib/sqlalchemy/dialects/postgresql/base.py#L892 –

+0

我認爲在大多數DB中TRUNCATE是DDL命令,而不是DML(請參見https:// stackoverflow.com/questions/2578194/what-is-ddl-and-dml)。 DDL命令固有地觸發提交。 – Dolfa

+1

@dolfa SQLA具體處理「自動提交」,它與發出的語句(或語句,雖然SQLA不正式支持多語句SQL,正如[在這個非常類似的帖子中]一樣)的正則表達式匹配(https:// stackoverflow。 COM /問題/ 45347565 /執行-多語句與 - PostgreSQL相關的通路SQLAlchemy的 - 不 - 不堅持-CH))。該正則表達式也包含ddl:create,alter等,但不能截斷。 –

相關問題