2017-08-18 41 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等,但不能截断。 –

相关问题