【问题标题】:COPY data from S3 to RedShift in python (sqlalchemy)在 python (sqlalchemy) 中将数据从 S3 复制到 RedShift
【发布时间】:2018-01-26 23:35:36
【问题描述】:

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

连接正常:

from sqlalchemy import create_engine 
engine = create_engine('postgresql://XXXX:XXXX@XXXX: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)

如果我删除“TRUNCATE TABLE 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)中都能完美运行

【问题讨论】:

  • 很确定这归结为how autocommit works,但还不确定如何,或者如果有的话。 TRUNCATE 和 COPY 都没有在 AUTOCOMMIT_REGEXP 模式中列出。尝试将 'COPY ...' 语句包装在 text(stmt).execution_options(autocommit=True) 构造中并将其传递给 engine.execute()
  • engine.execute(text(stmt).execution_options(autocommit=True))

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


【解决方案1】:

谢谢伊利亚。使用此命令它可以工作:

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

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

伊万

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2018-09-12
  • 1970-01-01
  • 2019-04-23
  • 2013-03-14
  • 2013-05-31
  • 1970-01-01
  • 1970-01-01
  • 2022-01-26
相关资源
最近更新 更多