반응형
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 결과 세트를 "스트리밍"할 수 있다는 것입니다. 현재의 모든 엔진 구현이 그렇게한다고 확신 할 수는 없습니다. 어쨌든 후자의 버전은 정당한 이유없이 그 효율성을 방해합니다.
반응형
'Programing' 카테고리의 다른 글
Maven에서 테스트를 위해 JPA를 구성하는 방법 (0) | 2020.11.12 |
---|---|
DBCC CHECKIDENT는 ID를 0으로 설정합니다. (0) | 2020.11.12 |
내장 모듈과 이름이 같은 모듈을 가져 오려고하면 가져 오기 오류가 발생합니다. (0) | 2020.11.12 |
속성과 변수의 차이점은 무엇입니까 (0) | 2020.11.12 |
Visual Studio : 프로젝트의 속성을 복사하여 다른 프로젝트에서 사용할 수 있나요? (0) | 2020.11.12 |