Program Tip

파이썬 db-api : fetchone vs fetchmany vs fetchall

programtip 2020. 11. 25. 08:21
반응형

파이썬 db-api : fetchone vs fetchmany vs fetchall


나는 오늘 파이썬의 db-api fetchone vs fetchmany vs 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

나는 그것이 실제로 구현에 달려 있다고 생각하지만 MySQLdb 소스를 살펴보면 차이점을 알 수 있습니다. 옵션에 따라 mysqldb fetch *는 현재 행 집합을 메모리 또는 서버 측에 유지하므로 fetchmany 대 fetchone은 여기에서 (python의) 메모리에 보관할 항목과 db 서버쪽에 보관할 항목을 알 수있는 유연성이 있습니다.

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


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

  • 페샬

테이블에서 모든 결과를 얻습니다. 이것은 테이블의 크기가 작을 때 더 잘 작동합니다. 테이블 크기가 더 크면 이러한 경우 fetchall이 실패합니다.

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

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

  • fetchmany

fetchmany는 필요한 수의 결과 만 가져옵니다. 결과와 프로세스를 산출 할 수 있습니다. fetchmany 구현의 간단한 스 니펫.

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

fetchone ()

쿼리 결과 집합의 다음 행을 가져 와서 단일 튜플을 반환하거나 더 이상 데이터를 사용할 수없는 경우 없음을 반환합니다.

>>> cur.execute("SELECT * FROM test WHERE id = %s", (3,))
>>> cur.fetchone()

(3, 42, 'bar')

execute * ()에 대한 이전 호출이 결과 세트를 생성하지 않았거나 아직 호출이 발행되지 않은 경우 ProgrammingError가 발생합니다.

fetchmany ([size = cursor.arraysize])

쿼리 결과의 다음 행 집합을 가져와 튜플 목록을 반환합니다. 더 이상 사용할 수있는 행이 없으면 빈 목록이 반환됩니다.

호출 당 페치 할 행 수는 매개 변수에 의해 지정됩니다. 지정되지 않은 경우 커서의 배열 크기는 가져올 행 수를 결정합니다. 메소드는 size 매개 변수에 표시된만큼의 행을 가져 오려고 시도해야합니다. 지정된 행 수를 사용할 수 없어서 이것이 가능하지 않은 경우 더 적은 행이 반환 될 수 있습니다.

>>> cur.execute("SELECT * FROM test;")
>>> cur.fetchmany(2)
[(1, 100, "abc'def"), (2, None, 'dada')]
>>> cur.fetchmany(2)
[(3, 42, 'bar')]
>>> cur.fetchmany(2)
[]

execute * ()에 대한 이전 호출이 결과 세트를 생성하지 않았거나 아직 호출이 발행되지 않은 경우 ProgrammingError가 발생합니다.

Note there are performance considerations involved with the size parameter. For optimal performance, it is usually best to use the arraysize attribute. If the size parameter is used, then it is best for it to retain the same value from one fetchmany() call to the next.

List item

fetchall()

Fetch all (remaining) rows of a query result, returning them as a list of tuples. An empty list is returned if there is no more record to fetch.

>>> cur.execute("SELECT * FROM test;")
>>> cur.fetchall()
[(1, 100, "abc'def"), (2, None, 'dada'), (3, 42, 'bar')]

A ProgrammingError is raised if the previous call to execute*() did not produce any result set or no call was issued yet.

참고URL : https://stackoverflow.com/questions/5189997/python-db-api-fetchone-vs-fetchmany-vs-fetchall

반응형