Redshift COPY操作在SQLAlchemy中不起作用

Ane*_*apu 6 python sqlalchemy amazon-redshift

我正在尝试在SQLAlchemy中进行Redshift COPY.

当我在psql中执行它时,以下SQL正确地将对象从我的S3存储桶复制到我的Redshift表中:

COPY posts FROM 's3://mybucket/the/key/prefix' 
WITH CREDENTIALS 'aws_access_key_id=myaccesskey;aws_secret_access_key=mysecretaccesskey' 
JSON AS 'auto';
Run Code Online (Sandbox Code Playgroud)

我有几个文件命名

s3://mybucket/the/key/prefix.001.json
s3://mybucket/the/key/prefix.002.json   
etc.
Run Code Online (Sandbox Code Playgroud)

我可以验证新行是否已添加到表中select count(*) from posts.

但是,当我在SQLAlchemy中执行完全相同的SQL表达式时,执行完成没有错误,但没有行添加到我的表中.

session = get_redshift_session()
session.bind.execute("COPY posts FROM 's3://mybucket/the/key/prefix' WITH CREDENTIALS aws_access_key_id=myaccesskey;aws_secret_access_key=mysecretaccesskey'    JSON AS 'auto';")
session.commit()
Run Code Online (Sandbox Code Playgroud)

无论我是做上述还是

from sqlalchemy.sql import text 
session = get_redshift_session()
session.execute(text("COPY posts FROM 's3://mybucket/the/key/prefix' WITH CREDENTIALS aws_access_key_id=myaccesskey;aws_secret_access_key=mysecretaccesskey'    JSON AS 'auto';"))
session.commit()
Run Code Online (Sandbox Code Playgroud)

ber*_*rio 7

我基本上有同样的问题,但在我的情况下它更多:

engine = create_engine('...')
engine.execute(text("COPY posts FROM 's3://mybucket/the/key/prefix' WITH CREDENTIALS aws_access_key_id=myaccesskey;aws_secret_access_key=mysecretaccesskey'    JSON AS 'auto';"))
Run Code Online (Sandbox Code Playgroud)

通过单步执行pdb,问题显然是缺少.commit()被调用的.我不知道为什么session.commit()不能在你的情况下工作(也许会话"丢失跟踪"发送的命令?)所以它可能实际上没有解决你的问题.

无论如何,正如sqlalchemy文档中解释的那样

鉴于此要求,SQLAlchemy实现了自己的"自动提交"功能,该功能在所有后端中完全一致.这是通过检测表示数据更改操作的语句来实现的,即INSERT,UPDATE,DELETE [...]如果语句是纯文本语句且未设置标志,则使用正则表达式来检测INSERT,UPDATE ,DELETE,以及特定后端的各种其他命令.

因此,有两种解决方案:

  • text("COPY posts FROM 's3://mybucket/the/key/prefix' WITH CREDENTIALS aws_access_key_id=myaccesskey;aws_secret_access_key=mysecretaccesskey' JSON AS 'auto';").execution_options(autocommit=True).
  • 或者,获得红移方言的固定版本......我刚开了一个关于它的公关


小智 7

在对我有用的副本末尾添加一个提交:

<your copy sql>;commit;
Run Code Online (Sandbox Code Playgroud)