2013-03-24 42 views
11

Tôi gặp sự cố khi thực thi lệnh sao chép để tải dữ liệu từ S3 sang Redshift của Amazon từ python.
Tôi đã lệnh sao chép sau đây:Sao chép dữ liệu từ S3 sang AWS bằng cách sử dụng python và psycopg2

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 ','; 

Khi tôi thực hiện lệnh này sử dụng SQL Workbench/j mọi thứ hoạt động như mong đợi, tuy nhiên khi tôi cố gắng thực hiện điều này với trăn và psycopg2 đèo lệnh OK nhưng không có dữ liệu là nạp và không có lỗi được ném.
thử hai tùy chọn sau (giả sử kết nối psycopg2 là OK vì nó là):

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

cả vượt qua mà không báo trước nhưng dữ liệu không được tải

Ý tưởng?

Cảm ơn

+0

Bạn cần gọi cam kết() sau khi thực thi() nếu không nó sẽ không có hiệu lực. – ciphor

Trả lời

-6

Cú pháp phải tương tự như câu lệnh DDL

# Create table 
c.execute('''CREATE TABLE stocks 
      (date text, trans text, symbol text, qty real, price real)''') 
22

Tôi đã sử dụng thiết lập chính xác này (psycopg2 + dịch chuyển đỏ + COPY) thành công. Bạn đã cam kết sau đó? SQL Workbench mặc định để tự động cam kết trong khi psycopg2 mặc định để mở một giao dịch, do đó dữ liệu sẽ không được hiển thị cho đến khi bạn gọi cam kết() trên kết nối của bạn.

Các quy trình làm việc đầy đủ là:

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

Tôi không tin rằng copy_expert() hoặc bất kỳ các cursor.copy_ * lệnh làm việc với chuyển đỏ.

+0

điều này giải quyết được vấn đề cho tôi. Tôi đã cố gắng sử dụng khung sqlalchemy của tôi để chạy lệnh sao chép và tôi không thể nhận được tải để cam kết. thread liên quan ở đây: http://stackoverflow.com/questions/28271049/redshift-copy-operation-doesnt-work-in-sqlalchemy tiếc là giải pháp cam kết tự động với sqlalchemy giải thích đã không làm việc cho tôi, nhưng ở trên với psycopg2 đã làm –

+0

@Voket nó bị mắc kẹt trên thực thi cho tôi và sau đó không thể chạy conn.commit(). Bất kỳ đề xuất? – Dnaiel

9

Trước tiên, hãy đảm bảo giao dịch là cam kết.

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

bạn có thể đảm bảo một giao dịch cam kết với sau cách cũng như (đảm bảo giải phóng các nguồn lực),

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

Khi một kết nối thoát với khối, nếu không có ngoại lệ đã được nâng lên bởi khối , giao dịch là cam kết. Trong trường hợp ngoại lệ, giao dịch được khôi phục.

Thứ hai, thậm chí làm cam kết không giúp khi dữ liệu được tải mất một thời gian dài và vượt quá connect_timeout (và không thể cam kết). Vì vậy, khi cam kết rõ ràng không giúp đỡ, hãy thử với thời gian chờ tăng lên.

Các vấn đề liên quan