2012-05-18 3 views
10

왜 python에 커서 객체가 필요한지 혼란 스럽습니다. 나는 JDBC를 알고 있으며 데이터베이스 연결은 매우 직관적이지만 파이썬에서는 커서 객체와 혼동 스럽다. 또한 cursor.close()와 connection.close() 함수의 차이점은 무엇인가에 대해서는 의문이 든다.커서와 연결 객체의 차이점

답변

13

커서 패러다임은 파이썬과 관련이 없지만 databases themselves의 빈번한 데이터 구조입니다.

기본 구현에 따라 동일한 연결을 데이터베이스에 공유하는 여러 커서를 생성 할 수 있습니다. 커서를 닫으면 DB에서 가져온 적이없는 (또는 가져 왔지만 사용되지 않은) 결과를 포함하여 쿼리와 관련된 리소스를 확보해야하지만 데이터베이스 자체에 대한 연결을 제거하지 않으므로 동일한 데이터베이스에서 새 커서를 가져올 수 있습니다 다시 인증 할 필요가 없습니다.

+0

우리는 동시에 두 개의 커서를 가질 수 있습니까? 그렇다면 동시성 문제에 대해 언급하십시오 –

+1

모든 세부 사항은 "기본 구현에 따라"숨겨집니다. 해당 DB 드라이버의 문서를 읽어야합니다. – Toote

+0

wikipedia에 따르면 : "컴퓨터 과학에서 데이터베이스 커서는 데이터베이스의 레코드를 순회 할 수있게 해주는 제어 구조입니다. 커서는 순회와 함께 후속 처리를 용이하게하며, 데이터베이스 레코드의 검색, 추가 및 제거와 같은 작업을 수행합니다. " 파이썬이 커서를 구현하는 방식은 설명과 잘 맞지 않습니다. 단순한 반복자라면 SQL 문을 실행하지 않아도됩니다. 그게 뭔가 파이썬 특정 아닌가요? 그리고 설명 할 가치가있는 것? – skyking

1

연결 개체는 데이터베이스에 대한 연결이며 데이터베이스 연결이 끝나면 닫습니다. Cursor 객체는 쿼리의 결과 집합에 대한 반복자입니다. 그 결과 세트로 끝났을 때 그것들을 닫으십시오.

+2

SQL 문자열을 실행하는 명령으로 execute (sql_string)가 있기 때문에 iterator가 아닌가 의심 스럽습니다. 결과 집합에 대한 반복자가 이러한 함수를 가지고있는 것은 의미가 없습니다. –

+0

맞지만 커서는 클라이언트의 구조 일뿐만 아니라 서버의 구조이기도합니다. SQL 문은 준비된 SQL 문을 사용하고 실행하며 실행 후 결과를 반복합니다. – Toote

5

다른 언급과 마찬가지로 Connection()은 데이터베이스에 대한 네트워크 연결이며 커서를 반환하는 것만 유용합니다. DBApi 2.0이 지정되어있는 PEP-249은 연결 또는 커서가 정확히 무엇인지를 명확하게 정의하지 않으며 각각에 대해 close() 메서드가 수행해야하는 작업을 명확하게 정의하지 않습니다. 해당 <module>.connect()<module>.Connection.cursor()<module>.Cursor 의 인스턴스를 반환해야한다는, <module>.Connection 의 인스턴스를 반환해야하며, <module>.Cursor.execute() 는 제공된 문을 호출하고 결과 행을 반환해야합니다. 특히, 특정 구현이 확장으로 구현할 수는 있지만 <module>.Connection.execute()을 정의하지 않습니다.

그러나 이러한 확장 기능에 따라 이동식 코드를 사용하지 않기 때문에 현명하지 않을 수 있습니다. DBApi는 중간 오브젝트없이 연결에서 실행하는 것이 일부 데이터베이스에서는 어려울 수 있으므로이 2 레벨 요구 사항을 만듭니다.

관련 문제