2014-11-03 2 views
2

일부 소스 데이터 소스에서 Postgres 데이터베이스로 데이터를로드해야합니다. 이 작업을 수행하려면 먼저 임시 CSV 파일에 데이터를 쓰고 COPY FROM 쿼리를 사용하여 CSV 파일의 데이터를 Postgres 데이터베이스로로드하십시오. 파이썬에서이 모든 작업을 수행합니다.임시 파일에 쓰지 않고 Postgres의 COPY FROM 파일 쿼리를 파이썬에서 사용하기

코드는 다음과 같습니다

table_name = 'products' 
temp_file = "'C:\\Users\\username\\tempfile.csv'" 
db_conn = psycopg2.connect(host, port, user, password, database) 
cursor = db_conn.cursor() 
query = """COPY """ + table_name + """ FROM """ + temp_file + " WITH NULL AS ''; """ 
cursor.execute(query) 

내가 중간 파일에 기록하는 단계를 피하려고. 대신 파이썬 객체에 작성한 다음 COPY FROM file 메소드를 사용하여 postgres 데이터베이스에 데이터를로드하고 싶습니다.

나는 this technique of using psycopg2's copy_from method which copies data from a StringIO object to the postgres database을 알고 있습니다. 그러나 psycopg2를 사용할 수 없기 때문에 COPY FROM 작업이 라이브러리에 종속되지 않도록해야합니다. 다른 Postgres 드라이버에서도 실행할 수있는 Postgres 쿼리가되고 싶습니다.

중간 파일에 쓰지 않고이 작업을 수행하는 것이 더 좋습니다.

+0

는 "그러나, 나는 이유 psycopg2를 사용할 수 없습니다"기존의 스타일보다 얻을, 안전 청소기, 그리고 쉽다. 그 이유는 ...? –

+0

내 직업에서 패키지 사용이 금지되었습니다. – user3422637

답변

6

당신은 (즉 subprocess.call를 사용하여) 스크립트에서 psql의 명령 줄 도구를 호출하고 임시 파일을 피하고, 다른 사람의 입력에 하나 개의 인스턴스의 출력을 파이프, 그 \copy 명령을 활용할 수 있습니다. 즉

psql -X -h from_host -U user -c "\copy from_table to stdout" | psql -X -h to_host -U user -c "\copy to_table from stdin"

이 테이블이 대상 데이터베이스에있는 가정합니다. 그렇지 않다면 별도의 명령으로 먼저 명령을 작성해야합니다.

또한이 방법의 한 가지주의 사항은 첫 번째 psql 호출의 오류가 파이프 프로세스에 의해 삼켜 질 수 있다는 것입니다.

4

psycopg2COPY 와이어 프로토콜을 지원하므로 COPY ... FROM STDIN/COPY ... TO STDOUT을 사용할 수 있습니다.

psycopg2 문서의 Using COPY TO and COPY FROM을 참조하십시오.

psycopg2를 사용할 수 없다고 했으므로 운이 좋지 않습니다. 드라이버를 사용하려면 COPY TO STDOUT/COPY FROM STDIN을 이해해야하며 드라이버의 네트워크 소켓을 납치하고 직접 COPY 프로토콜을 구현할 수 있도록 원시 데이터를 소켓에 쓰는 방법을 제공해야합니다. 드라이버 전용 코드가 반드시 필요합니다. 단순히 DB-API를 사용할 수는 없습니다.

그래서 khampson의 제안은 대개 정말 나쁜 생각 인 반면에 유일한 대안 인 것 같습니다.

(I이 대부분 할이 답을 찾을 다른 사람이 psycopg2이 제정신 일을 사용에 대한 제한이 없습니다 있는지 확인 게시하도록하겠습니다.)

경우 해야 사용 psql, 사항 : Popen 생성자

  • 패스 -qAtX-v ON_ERROR_STOP=1

    • Use the subprocess module 일괄 처리에 정상적인 동작을 얻으려면 psql으로 변경하십시오.
    • array form 명령을 사용하십시오. ['psql', '-v', 'ON_ERROR_STOP=1', '-qAtX', '-c', '\copy mytable from stdin']을 사용하는 것이 좋습니다.
    • psql의 stdin에 입력 한 다음 닫고 psql이 완료 될 때까지 기다립니다.
    • 명령 실패시 발생하는 예외를 트랩하는 것을 잊지 마십시오. subprocess을 stderr로 캡쳐하고 예외 객체로 감 쌉니다.

    그것은 바로 os.popen2

  • 관련 문제