2011-03-04 3 views
49

저는 파이썬의 db-api fetchone 대 fetchmany 대 fetchall에 관한 몇몇 동료들과 토론을했습니다.Python db-api : fetchone 대 fetchmany 대 fetchall

각각의 유스 케이스는 내가 사용하고있는 db-api의 구현에 따라 다르지만 일반적으로 fetchone 대 fetchmany 대 fetchall의 사용 사례는 무엇입니까?

다른 말로 표현하면 다음과 같습니다. 아니면 다른 것들보다 선호되는 이들 중 하나입니까? 그렇다면 어떤 상황에서?

cursor.execute("SELECT id, name FROM `table`") 
for i in xrange(cursor.rowcount): 
    id, name = cursor.fetchone() 
    print id, name 


cursor.execute("SELECT id, name FROM `table`") 
result = cursor.fetchmany() 
while result: 
    for id, name in result: 
     print id, name 
    result = cursor.fetchmany() 


cursor.execute("SELECT id, name FROM `table`") 
for id, name in cursor.fetchall(): 
    print id, name 

답변

13

실제로 구현에 따라 다르지만 MySQLdb 소스를 살펴보면 차이점을 알 수 있습니다. 옵션에 따라 mysqldb fetch *는 메모리 또는 서버 측의 현재 행 집합을 유지하므로 fetchmany 대 fetchone은 (파이썬의) 메모리를 유지하고 db 서버 측을 유지할 부분을 알기 위해 유연성을 가지고 있습니다.

PEP 249는 세부 사항을 제공하지 않으므로 정확한 의미가 구현 정의되어있는 동안 데이터베이스에 따라 최적화하는 것이 좋습니다.

+6

대부분의 메모리를 사용하는 fetchall()에서 이러한 메모리 사용량에 차이가 있습니다. –

+0

이 세 가지 가져 오기 명령은 나도 내 머리를 긁적이게했다. 해당 Python이 myServer 서버와 동일한 서버에서 실행되고 있다면 어떻게 될까요? – SMGreenfield

4

이는 구현에 따라 다릅니다.

  • fetchall

는 테이블의 모든 결과를 얻을 수 있습니다. 테이블의 크기가 작 으면 더 잘 작동합니다. 테이블 크기가 더 크면 fetchall이 실패합니다.

대부분의 메모리를 사용합니다.

네트워크에서 쿼리를 수행하면 몇 가지 문제가 발생할 수 있습니다.

  • 으로 fetchmany

으로 fetchmany은 결과의 수를 요구 받게됩니다. 결과와 프로세스를 얻을 수 있습니다. fetchmany 구현의 간단한 스 니펫.

while True: 
    results = cursor.fetchmany(arraysize) 
    if not results: 
     break 
    for result in results: 
     yield result