문제

결과 세트를 반복하는 방법에는 여러 가지가 있습니다.각각의 장단점은 무엇입니까?

도움이 되었습니까?

해결책

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

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()]

이는 작은 결과 집합에 유용할 수 있지만 결과 집합이 크면 나쁜 부작용이 있을 수 있습니다.

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

  • 내장 목록을 보유하기 위해 고객에게 많은 기억을 먹을 수 있습니다.

  • 파이썬이 어쨌든 즉시 버릴 목록을 구성하고 해체하는 데 시간이 걸릴 수 있습니다.


결과 세트에 단일 행이 반환된다는 것을 알고 있는 경우 다음을 호출할 수 있습니다. fetchone() 단일 행을 얻으려면.

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

마지막으로 한 번에 한 행을 가져오는 결과 집합을 반복할 수 있습니다.일반적으로 이 작업을 수행하면 반복자를 사용하는 것보다 특별한 이점이 없습니다.

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

다른 팁

내가 선호하는 방법은 커서 반복자이지만 커서의 arraysize 속성을 먼저 설정하는 것입니다.

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

이 예에서 cx_Oracle은 한 번에 Oracle 256개 행에서 행을 가져와 수행해야 하는 네트워크 왕복 횟수를 줄입니다.

방법도 있어요 psyco-pg 할 것 같다...내가 수집한 바에 따르면 키 조회를 쿼리에서 반환된 메모리 블록에 매핑하기 위해 사전과 같은 행 프록시를 만드는 것 같습니다.이 경우 전체 답변을 가져오고 행에 대해 유사한 프록시 팩토리를 사용하여 작업하는 것이 유용한 아이디어처럼 보입니다.그런데 생각해보면 Python보다는 Lua에 더 가까운 느낌이 듭니다.

또한 이는 모든 사람에게 적용되어야 한다. PEP-249 DBAPI2.0 Oracle뿐만 아니라 인터페이스를 의미합니까? 가장 빠른 사용하여 신탁?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top