从python中的S3到RedShift的COPY数据(sqlalchemy)

时间:2017-08-18 10:05:03

标签: python sql amazon-s3 sqlalchemy amazon-redshift

我正在努力推动(使用COPY)从s3到Redshift的大文件。我在python中使用sqlalchemy来执行sql命令,但它看起来只有在我初步TRUNCATE表时副本才有效。

连接正常:

> sudo zip -d org.eclipse.birt.runtime_4.6.0-20160607.jar META-INF/ECLIPSE_.RSA 
> sudo zip -d org.eclipse.birt.runtime_4.6.0-20160607.jar META-INF/ECLIPSE_.SF 
> sudo zip -d org.eclipse.datatools.connectivity.oda_3.5.0.201603142002.jar META-INF/ECLIPSE_.RSA 
> sudo zip -d org.eclipse.datatools.connectivity.oda_3.5.0.201603142002.jar META-INF/ECLIPSE_.SF

使用此命令字符串(如果我在COPY命令之前截断表)

from sqlalchemy import create_engine 
engine = create_engine('postgresql://XXXX:XXXX@XXXX:XXXX/XXXX') 

如果我删除“TRUNCATE TABLE public.my_table;”位

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)

但该命令与任何其他SQL客户端(例如DBeaver)完美配合

1 个答案:

答案 0 :(得分:0)

谢谢Ilja。使用此命令可以:

((expression))
          The expression is evaluated according to  the  rules  described  below
          under  ARITHMETIC  EVALUATION.  If the value of the expression is non-
          zero, the return status is 0; otherwise the return status is 1.   This
          is exactly equivalent to let "expression".

我不知道为什么我能够使用字符串前面的TRUNCATE位来推送数据。

伊万