16

copy コマンドを実行して S3 から Python の 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 を渡しますが、データは読み込まれず、エラーはスローされません。
次の2つのオプションを試しました(psycopg2接続がOKであると仮定します):

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 ブロックを出るとき、ブロックによって例外が発生していなければ、トランザクションはcommitされます。例外が発生した場合、トランザクションはロールバックされます。

第 2に、データをロードするのに時間がかかり、connect_timeout を超える (そしてコミットできない) 場合は、commit を実行しても役に立ちません。したがって、明示的なコミットが役に立たない場合は、タイムアウトを増やしてみてください。

于 2013-12-05T00:53:20.027 に答える
-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 に答える