2014-04-30 2 views
8

일부 데이터를 INSERT 및 UPDATE로 수정하고 싶습니다. psycopg 튜토리얼에서 그것은 postgres에 의해 정의 된대로 내가psycopg에서`cursor` 클래스의 핵심은 무엇입니까?

cur = connection.cursor() 
cur.execute(my_insert_statement) 
connection.commit() 

Psycopg의 cursor class이 커서과 거의 갖고있는 것 같아요 필요한 것 같습니다.

내가 (단지 모듈화에 대한 스레딩) 주요 모듈의 연결 및 일부 작업자 기능을 만들어 내 스크립트를 모듈화하면 나는

  1. 는 기능에 연결 매개 변수를 전달하고 커서를 때마다 다시한다 . 새로운 커서 객체를 자주 만드는 데 상당한 오버 헤드가 있습니까?

    def process_log_file(self, connection): 
    
  2. 패스 연결 및 커서 모두 - 불필요하게 복잡한 기능 서명 및 구현

    def process_log_file(self, connection, cursor): 
    
  3. 패스는 매개 변수로 커서 및 커밋에 대한 mycursor.connection.commit()를 사용하게

    def process_log_file(self, cursor): 
    
+0

Psycopg 커서 클래스를 사용하는 방법은 postgresql 커서를 거의 수행하지 못합니다. 그러나 그들을 사용하는 다른 방법이 있습니다. 모듈이 트랜잭션에 걸쳐 있거나 트랜잭션이 모듈에 걸쳐 있습니까? 아니면 항상 완벽한 통신이 있습니까? – jjanes

답변

6

세의 모든 작동 (이것은 주로 개인적인 취향의 문제이다)하지만 것입니다 내가 더 좋아 (1). 이유는 다음과 같습니다.

유형이 가볍고 새로운 Python 개체를 만드는 것 외에는 특별한 작업을 수행하지 않습니다. 원하는대로 커서를 생성, 사용 (커밋/롤백)하고 파괴 할 수 있습니다. 특히 코드를 깨끗하게 정리할 수 있다면 도움이됩니다.

또한 여러 개의 서로 다른 쿼리에서 오는 데이터에 액세스해야하는 복잡한 논리로 작업 할 때 cursor이 중요합니다.이 경우 커서는 데이터의 소유자/반복자 역할을합니다.

마지막으로 connection (실제 핸들을 백엔드로 전달) 및 커서를 특정 기능/메소드에 로컬로 유지하는 것이 "옳은 느낌"입니다.

1

Python DB API Specification 메시지 :

"데이터베이스 커서 ... 페치 작업의 컨텍스트를 관리하는 데 사용됩니다."

모듈성을 살펴보면 함수가 이전 연산의 결과를 필요로하지 않는 한 새 커서를 만들고 닫거나 닫을 때 스스로 닫을 수 있습니다. 범위. 여러 번 반복하는 작업이 있고 커서를 다시 작성하면 오버 헤드가 발생할 것이라는 점을 확신하면 간단한 도우미 함수 대신 커서를 래핑하는 도우미 클래스를 만들 수 있습니다.

그러나 세 가지 방법 모두 잘 작동합니다. 스타일 # 2를 사용하여 개인적으로 코드를 작성했습니다.하지만 그 중 가장 나쁜 것 같아요.

2

cursorwith 사용 패턴을 지원합니다. 사용 패턴은 블록이 완료되면 자동으로 닫힙니다.이는 커서로 컴팩트 한 작업을 수행 할 때 매우 유용한 패턴이 될 수 있습니다.

다른 시간에

, 커서는 함수 전반에 걸쳐 사용 될 필요가있다, 또는 여러 커서를 사용할 필요가 있고, 그래서 경우에 with 패턴은 덜 감각을 만들 것, 그것은 최고의 기능 수준에서 선언 할 것이다 범위.

named cursors의 중요성을 기억하십시오. psycopg 커서와 Postgres 커서가 서로 얽혀 있습니다. name 속성에 생성자 호출 값을 지정하면 서버 측 커서가 자동으로 생성되어 모든 파이썬 콜렉션과 마찬가지로 반복 될 수 있으며 청크 페치를 수행합니다.

청크 크기는 기본적으로 2000 블록 단위로 가져 오지만 변경 될 수 있습니다. 큰 테이블을 쿼리 할 때 이것은 특히 중요합니다. 거대한 결과 세트로 메모리 클라이언트 측을 빨리 다 써 버릴 수 있기 때문입니다. psycopg는 Postgres 커서를 직접 다룰 필요가 있으며, 필요할 때 커서가 반복되는 동안 다음 청크를 투명하게 가져옵니다.

명명 된 커서는 실제로 한 가지만 사용할 수 있습니다. 즉, 반복되는 쿼리입니다. 동일한 커서에서 다른 쿼리를 실행하려고하면 메모리가 작동하면 예외가 발생합니다. 이름이 지정되지 않은 커서를 사용하면 결과가 끝나면 동일한 커서를 다시 실행할 수 있습니다.

일반적으로 상당히 큰 결과 집합을 반환 할 가능성이있는 쿼리와 작은 쿼리 및 업데이트, 삭제, 테이블 만들기 등과 같은 다른 명령에 대해서는 이름이 지정되지 않은 커서에 대해 명명 된 커서를 사용합니다.

관련 문제