programing

Python db-api: fetchone vs fetchmany vs fetchall

sourcejob 2022. 11. 24. 21:38
반응형

Python db-api: fetchone vs fetchmany vs fetchall

오늘 python의 db-api fetchone vs fetchmany vs fetchall에 대해 동료들과 논의를 했습니다.

각 사용 사례는 사용 중인 db-api 구현에 따라 다르겠지만 일반적으로 fetchone vs fetchmany vs 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

공식 psycopg2 문서에 따라

fetchone()

쿼리 결과 세트의 다음 행을 가져와 단일 태플을 반환하거나 더 이상 사용할 수 있는 데이터가 없으면 없음:

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

(3, 42, 'bar')

Programming Error는 이전에 실행*()한 콜에서 결과 세트가 생성되지 않았거나 콜이 아직 발행되지 않은 경우 발생합니다.

fetch many([size=metric.metricize])

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

콜당 취득하는 행의 수는 파라미터로 지정합니다.이 값을 지정하지 않으면 커서의 배열 크기에 따라 가져올 행 수가 결정됩니다.메서드는 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)
[]

Programming Error는 이전에 실행*()한 콜에서 결과 세트가 생성되지 않았거나 콜이 아직 발행되지 않은 경우 발생합니다.

size 파라미터에는 퍼포먼스에 관한 고려사항이 있습니다.최적의 성능을 얻으려면 일반적으로 arraysize 속성을 사용하는 것이 가장 좋습니다.size 파라미터를 사용하는 경우 fetchmany() 콜 간에 동일한 값을 유지하는 것이 가장 좋습니다.

목록 항목

fetchall()

쿼리 결과의 나머지 행을 모두 가져와 튜플 목록으로 반환합니다.가져올 레코드가 더 이상 없으면 빈 목록이 반환됩니다.

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

Programming Error는 이전에 실행*()한 콜에서 결과 세트가 생성되지 않았거나 콜이 아직 발행되지 않은 경우 발생합니다.

실장에 따라 다르다고 생각합니다만, MySQLdb 소스를 조사하면 차이를 알 수 있습니다.옵션에 따라 mysqldb fetch*는 현재 일련의 행을 메모리 또는 서버 측에 보관하기 때문에 fetchmany vs fetchone은 (python's) 메모리에 보관해야 할 항목과 DB 서버 측에 보관해야 할 항목을 유연하게 파악할 수 있습니다.

PEP 249는 자세한 내용이 없기 때문에 정확한 시멘틱스가 정의되어 있는 동안 데이터베이스에 따라 최적화하기 위한 것이라고 생각합니다.

이것들은, 실장 마다 다릅니다.

  • 페치올

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

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

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

  • 많이 팔리다

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

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

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

반응형