16

我在执行复制命令以从 python 将数据从 S3 加载到 Amazon 的 Redshift 时遇到问题。
我有以下复制命令:

copy moves from 's3://<my_bucket_name>/moves_data/2013-03-24/18/moves'
credentials 'aws_access_key_id=<key_id>;aws_secret_access_key=<key_secret>'
removequotes
delimiter ',';

当我使用 SQL Workbench/j 执行此命令时,一切都按预期工作,但是当我尝试使用 python 和 psycopg2 执行此命令时,命令通过 OK,但没有加载数据,也没有引发错误。
尝试了以下两个选项(假设 psycopg2 连接正常,因为它是):

cursor.execute(copy_command)  
cursor.copy_expert(copy_command, sys.stdout)

两者都通过而没有警告但尚未加载数据

想法?

谢谢

4

4 回答 4

28

我已经成功地使用了这个精确的设置(psycopg2 + redshift + COPY)。你后来答应了吗?SQL Workbench 默认为自动提交,而 psycopg2 默认为打开事务,因此在您在连接上调用 commit() 之前数据将不可见。

完整的工作流程是:

conn = psycopg2.connect(...)
cur = conn.cursor()
cur.execute("COPY...")
conn.commit()

我不相信 copy_expert() 或任何 cursor.copy_* 命令可与 Redshift 一起使用。

于 2013-03-27T01:19:26.853 回答
16

首先,确保事务已提交

conn = psycopg2.connect(conn_string)
cur = conn.cursor()
cur.execute(copy_cmd_str)
conn.commit()

您也可以通过以下方式确保事务提交(确保释放资源),

with psycopg2.connect(conn_string) as conn:
    with conn.cursor() as curs:
        curs.execute(copy_cmd_str)

当连接退出 with 块时,如果该块没有引发异常,则事务被提交。如果出现异常,事务将回滚。

其次,当要加载的数据需要很长时间并且超过 connect_timeout (并且无法提交)时,即使执行提交也无济于事。因此,当显式提交没有帮助时,请尝试增加超时时间。

于 2013-12-05T00:53:20.027 回答
4

如果您使用的是 sqlalchemy,则复制命令不会自行自动提交。这对我有用:

from sqlalchemy import create_engine
eng = create_engine(...)
command = """
copy command here
"""
conn = eng.connect()
result = conn.execution_options(autocommit=True).execute(command)
result.close()
于 2018-11-29T20:44:07.903 回答
-8

语法应该类似于 DDL 语句

# Create table
c.execute('''CREATE TABLE stocks
             (date text, trans text, symbol text, qty real, price real)''')
于 2013-03-24T22:20:28.163 回答