programing

cx_Oracle:결과 세트를 반복하려면 어떻게 해야 합니까?

newsource 2023. 3. 31. 22:27

cx_Oracle:결과 세트를 반복하려면 어떻게 해야 합니까?

결과 세트에 대해 반복하는 방법은 여러 가지가 있습니다.각각의 트레이드오프는 무엇입니까?

표준적인 방법은 내장된 커서 반복기를 사용하는 것입니다.

curs.execute('select * from people')
for row in curs:
    print row

사용할 수 있습니다.fetchall()한 번에 모든 행을 가져옵니다.

for row in curs.fetchall():
    print row

이를 사용하여 반환된 값을 포함하는 Python 목록을 작성할 수 있습니다.

curs.execute('select first_name from people')
names = [row[0] for row in curs.fetchall()]

이 방법은 작은 결과 세트에 유용할 수 있지만 결과 세트가 클 경우 부작용이 발생할 수 있습니다.

  • 전체 결과 세트가 클라이언트 프로세스로 반환될 때까지 기다려야 합니다.

  • 빌드업 리스트를 유지하기 위해 클라이언트의 메모리를 많이 소비할 수 있습니다.

  • 어차피 Python이 즉시 폐기할 목록을 작성 및 해체하는 데 다소 시간이 걸릴 수 있습니다.


결과 세트에 1개의 행이 반환되는 것을 알고 있는 경우는, 문의해 주세요.fetchone()1열로 이동합니다.

curs.execute('select max(x) from t')
maxValue = curs.fetchone()[0]

마지막으로 결과 세트를 루프하여 한 번에 한 행씩 가져올 수 있습니다.일반적으로 반복기를 사용하는 것보다 이 작업을 수행하는 데 특별한 이점이 없습니다.

row = curs.fetchone()
while row:
    print row
    row = curs.fetchone()

제가 선호하는 방법은 커서 반복기이지만 먼저 커서의 배열 크기를 설정합니다.

curs.execute('select * from people')
curs.arraysize = 256
for row in curs:
    print row

이 예에서는 cx_Oracle이 Oracle 256 행에서 한 번에 행을 가져오므로 실행해야 하는 네트워크 라운드 트립 수가 줄어듭니다.

길도 있다.psyco-pg그런 것 같아...제가 아는 바로는 키 검색을 쿼리에 의해 반환된 메모리 블록에 매핑하기 위해 사전과 같은 행 프록시를 작성하는 것 같습니다.이 경우 전체 답변을 가져와 행에 걸쳐 유사한 프록시 팩토리를 사용하는 것이 유용한 아이디어로 보입니다.근데 생각해보면 파이썬이라기보다 루아 같은 느낌이에요.

또한 이는 Oracle뿐만 아니라 모든 PEP-249 DBAPI 2.0 인터페이스에 적용 가능해야 합니다. 아니면 Oracle을 가장 빠르게 사용한다는 의미입니까?

언급URL : https://stackoverflow.com/questions/594/cx-oracle-how-do-i-iterate-over-a-result-set