2013-03-24 4 views
11

S3의 데이터를 python에서 Amazon의 Redshift로로드하는 데 copy 명령을 실행하는 데 문제가 있습니다.
나는 다음과 같은 복사 명령했다 : 나는 SQL 워크 벤치/J의 모든 것을 사용하여이 명령을 실행하면 예상대로 내가 함께 파이썬이 실행하고 OK 명령 패스를 psycopg2하려고하지만 경우python 및 psycopg2를 사용하여 S3에서 AWS로 레드 쉬프트 복사

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

작동하지만 데이터가 없습니다 로드되고 오류가 발생하지 않습니다.

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

모두 아직 데이터가

아이디어를로드되지 않습니다 경고없이 통과 :
다음과 같은 두 가지 옵션 (이 때문에 psycopg2 연결이 OK라고 가정)를 시도? 나는 성공적으로 정확한 설치 (psycopg2 + 적색 편이 + COPY)를 사용해

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

execute() 후에 commit()을 호출해야합니다. 그렇지 않으면 유효하지 않습니다. – ciphor

답변

-6

이 구문은 DDL 문에 유사해야합니다. 나중에 커밋 했니? psycopg2는 기본적으로 트랜잭션을 여는 동안 SQL Workbench는 자동 커밋을 기본으로하므로 연결시 commit()을 호출 할 때까지 데이터가 표시되지 않습니다.

전체 워크 플로우는 다음과 같습니다 내가 명령이 적색 편이 작동 * 그 copy_expert() 또는 cursor.copy_의 믿을 수 없어

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

.

22

감사

+0

이 문제가 해결되었습니다. 내 sqlalchemy 프레임 워크를 사용하여 복사 명령을 실행하려고했는데 커밋 할로드를 가져올 수 없습니다. 관련 스레드 여기에 : http://stackoverflow.com/questions/28271049/redshift-copy-operation-doesnt-work-in-sqlalchemy sqlalchemy와 자동 커밋 솔루션 나를 위해 작동하지 않았다 설명하지만 위의 psycopg2와 함께 –

+0

@Voket 그것은 나를 위해 실행에 집착하고 conn.commit()를 실행할 수 없습니다. 어떤 제안? – Dnaiel

9

우선 거래가 입니다. 연결 블록과를 종료하면 예외가 블록에 의해 제기되어 있지 않은 경우

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) 

을 보장 할 수 있습니다 거래는 이고 커밋 된 거래는입니다. 예외가 발생하면 트랜잭션이 롤백됩니다.

두 번째로, 커밋을해도로드 할 데이터가 오랜 시간이 걸리고 connect_timeout을 초과 할 때 (커밋 할 수없는 경우) 도움이되지 않습니다. 따라서 명시 적 커밋이 도움이되지 않으면 시간 초과를 시도하십시오.