Programing

Sqlalchemy-for 루프에서 query와 query.all의 차이점

lottogame 2020. 11. 12. 07:39
반응형

Sqlalchemy-for 루프에서 query와 query.all의 차이점


나는 차이점이 무엇인지 묻고 싶습니다

for row in session.Query(Model1):
    pass

for row in session.Query(Model1).all():
    pass

첫 번째는 반복자가 단일 쿼리로 DB를 폭격하고 후자는 전체를 목록으로 쿼리합니다 (예 : range (x) 대 xrange (x))?


아니요, DB 트래픽에는 차이가 없습니다. 차이점은 for row in session.Query(Model1)ORM이 사용자에게 제공하려고 할 때 각 행에서 작동하는 반면 for row in session.Query(Model1).all()ORM은 사용자에게 제공하기 전에 모든 행에서 작동한다는 것입니다.

참고 q.all()단지 설탕이다 list(q), 즉리스트로 발전기에 의해 산출 모든 것을 수집. 다음은 클래스 소스 코드 입니다 Query( def all링크 된 소스에서 찾기 ).

def all(self):
    """Return the results represented by this ``Query`` as a list.

    This results in an execution of the underlying query.

    """
    return list(self)

... 여기서 self쿼리 객체는 반복 가능합니다. 즉, __iter__메서드가 있습니다.

따라서 논리적으로 두 가지 방법은 DB 트래픽 측면에서 정확히 동일합니다. 둘 다 query.__iter__()행 반복자를 얻기 위해 호출 하고 next()그것을 통과합니다.

실질적인 차이점은 전자 데이터가 도착하자마자 행 제공을 시작하여 메모리 사용과 대기 시간을 줄이면서 DB 결과 세트를 "스트리밍"할 수 있다는 것입니다. 현재의 모든 엔진 구현이 그렇게한다고 확신 할 수는 없습니다. 어쨌든 후자의 버전은 정당한 이유없이 그 효율성을 방해합니다.

참고 URL : https://stackoverflow.com/questions/1078383/sqlalchemy-difference-between-query-and-query-all-in-for-loops

반응형