SQLite 데이터베이스를 쿼리할 때 커서를 만들어야 하는 이유는 무엇입니까?
저는 Python의 sqlite3 모듈(그리고 그 문제에 대해서는 일반적으로 SQL)에 완전히 익숙하지 않습니다. 그리고 이것은 저를 완전히 놀라게 합니다.사물에 대한 설명이 풍부하지 않은 것도 이상해 보입니다.
다음 코드 조각은 선호되는 작업 방식입니다.
import sqlite3
conn = sqlite3.connect("db.sqlite")
c = conn.cursor()
c.execute('''insert into table "users" values ("Jack Bauer", "555-555-5555")''')
conn.commit()
c.close()
이것은 비록 그것이 똑같이 잘 작동하고 (겉보기에는 무의미해 보이지만) 그렇지 않습니다.cursor
:
import sqlite3
conn = sqlite3.connect("db.sqlite")
conn.execute('''insert into table "users" values ("Jack Bauer", "555-555-5555")''')
conn.commit()
누가 내게 왜 필요한지 말해줄 수 있나요?cursor
?
그저 무의미한 간접비처럼 보일 뿐입니다.데이터베이스에 액세스하는 스크립트의 모든 메서드에 대해 다음을 생성하고 삭제해야 합니다.cursor
?
그냥 사용하는 게 어때요?connection
목적어?
제가 보기에는 단지 잘못 적용된 추상적인 것 같습니다.db 커서는 데이터 세트 트래버설을 의미하는 추상화입니다.
컴퓨터 과학과 기술에서 데이터베이스 커서()는 데이터베이스의 레코드에 대한 횡단을 가능하게 하는 제어 구조입니다.커서는 데이터베이스 레코드 검색, 추가 및 제거와 같은 트래버설과 관련된 후속 처리를 용이하게 합니다.통과의 데이터베이스 커서 특성은 커서를 반복기의 프로그래밍 언어 개념과 유사하게 만듭니다.
그리고:
커서는 DBMS에서 애플리케이션으로 데이터를 가져올 뿐만 아니라 업데이트하거나 삭제할 테이블의 행을 식별하는 데도 사용할 수 있습니다.SQL:2003 표준은 위치 업데이트 및 위치 삭제 SQL 문을 정의합니다.이러한 문은 술어가 있는 일반 WHERE 절을 사용하지 않습니다.대신 커서가 행을 식별합니다.커서는 FETCH 문을 사용하여 열려야 하며 이미 행에 위치해야 합니다.
Python sqlite 모듈에서 문서를 확인하면 Python 모듈이cursor
도▁a에도 합니다.CREATE TABLE
진술, 그래서 그것은 단순한 경우에 사용됩니다.connection
OP가 정확하게 지적한 바와 같이 객체로 충분해야 합니다.이러한 추상화는 사람들이 데이터베이스 커서를 이해하는 것과 다르므로 사용자 측의 혼란/불만입니다.효율성과 상관없이 개념적인 오버헤드일 뿐입니다.문서에서 파이썬 모듈이 지적되었으면 좋겠습니다.cursor
는 SQL 및 데이터베이스에 있는 커서와 약간 다릅니다.
공식 문서에 의하면. connection.execute()
는 중간 커서 개체를 만드는 비표준 바로 가기입니다.
연결.실행에 옮기다
커서() 메서드를 호출하여 커서 개체를 만들고 지정된 매개 변수로 커서의 execute() 메서드를 호출한 다음 커서를 반환하는 비표준 바로 가기입니다.
12.6.8. sqlite3를 효율적으로 사용하기
12.6.8.1.바로 가기 방법 사용
비표준 사용
execute()
,executemany()
그리고.executescript()
Connection 개체의 메서드는 커서 개체를 명시적으로 생성할 필요가 없으므로 코드를 보다 간결하게 작성할 수 있습니다.대신 커서 개체가 암시적으로 생성되고 이러한 바로 가기 메서드는 커서 개체를 반환합니다.이렇게 하면 SELECT 문을 실행하고 Connection 개체에 대한 단일 호출만 사용하여 직접 반복할 수 있습니다.
(sqlite3 설명서, 내 것을 강조합니다.
그냥 연결 개체를 사용하는 게 어때요?
연결 개체의 이러한 메서드는 표준이 아니므로 Python Database API Specification v2.0(PEP 249)의 일부가 아닙니다.
Cursor 개체의 표준 메서드를 사용하는 한 위의 사양을 따르는 다른 데이터베이스 구현으로 전환하면 코드를 완전히 이동할 수 있습니다.아마도 당신은 그것을 바꾸기만 하면 될 것입니다.import
선을
하지만 만약 당신이 그것을 사용한다면.connection.execute
전환이 그렇게 간단하지 않을 가능성이 있습니다.그것이 당신이 사용하고자 하는 주요 이유입니다.cursor.execute
대신.
하지만 만약 당신이 전환하지 않을 것이 확실하다면, 저는 그것을 가져가는 것이 완전히 괜찮다고 말할 것입니다.connection.execute
바로 가기 및 "효율적"입니다.
결과를 가져오려면 커서 개체가 필요합니다.당신의 예는 그것이 효과적이기 때문에.INSERT
따라서 당신은 그것으로부터 어떤 행도 되돌리려고 노력하지 않지만, 문서를 보면, 당신은 그것이 없다는 것을 알아차릴 것입니다..fetchXXXX
연결 개체에 대한 메소드, 그래서 만약 당신이 시도했다면.SELECT
커서가 없으면 결과 데이터를 가져올 수 없습니다.
첫 번째 결과 가져오기를 완료하기 전에 여러 쿼리를 실행할 수 있으므로 커서 개체를 사용하여 결과 집합을 추적할 수 있습니다.
데이터베이스에 대한 동일한 연결을 통해 여러 개의 개별 작업 환경을 구축할 수 있습니다.
언급URL : https://stackoverflow.com/questions/6318126/why-do-you-need-to-create-a-cursor-when-querying-a-sqlite-database
'IT' 카테고리의 다른 글
Numpy를 사용하여 Python에서 TIFF(가져오기, 내보내기) 작업 (0) | 2023.08.26 |
---|---|
spring-data-jpa: ORA-01795: 목록의 최대 식 수는 1000입니다. (0) | 2023.08.21 |
시작 및 종료 인덱스가 주어지면 C에서 문자열의 일부를 복사하려면 어떻게 해야 합니까? (0) | 2023.08.21 |
PHP와 Ajax를 사용하여 배열을 Javascript로 전달하는 방법은 무엇입니까? (0) | 2023.08.21 |
두 NSDate 비교 및 시간 성분 무시 (0) | 2023.08.21 |