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
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
'programing' 카테고리의 다른 글
MySQL 임시 테이블 vs where in 절 (0) | 2022.11.24 |
---|---|
Java String이 모든 공백 공간이 아님을 확인하려면 어떻게 해야 합니까? (0) | 2022.11.24 |
싱글톤의 대체 수단 (0) | 2022.11.23 |
JavaScript의 'new' 키워드는 무엇입니까? (0) | 2022.11.23 |
엔티티에서 Enum을 사용할 때 쿼리 생성 관련 문제 (0) | 2022.11.23 |