SQLAlchemy 2

sqlalchemy에서 joinedload와 Query.join()의 차이점

tl;dr joinedload를 사용하면 JOIN된 전체 attribute들을 select하나, Query.join()은 query의 대상이 되는 table의 항목들만 select의 대상이 된다. 이 글은 SQLAlchemy의 공식 문서를 번역한 것입니다. 원문: https://docs.sqlalchemy.org/en/14/orm/loading_relationships.html#sqlalchemy.orm.joinedload Joinedload는 Query.join()의 사용과 많은 유사점이 있기 때문에, 언제 어떻게 사용해야 하는지에 대해 혼동을 일으키는 경우가 많습니다. Query.join()은 쿼리 결과를 변경하는 데 사용되는 반면, joinedload()는 쿼리 결과를 변경하지 않고 렌더링된 조인의..

Python/sqlalchemy 2023.10.22

FastAPI + SQLAlchemy 로 N+1 쿼리 해결하기

N+1쿼리란 ORM에서 성능 이슈가 발생하면 가장 흔한 원인으로 `N+1 Problem`이 언급된다. N+1 Problem은 쿼리 1번으로 N건의 데이터를 가져왔는데 원하는 데이터를 얻기 위해 이 N건의 데이터를 데이터 수 만큼 반복해서 2차적으로 쿼리를 수행하는 문제이다. 이러한 문제가 발생하는 이유는 Object Mapper에서 데이터를 가져올 때 찾고자하는 객체에 대한 정보를 먼저 로딩하는데, 이때 해당 객체의 멤버 변수 등으로 연결되어 있는 다른 클래스와 매핑된 테이블 내의 데이터를 JOIN을 통해 가져오지 못하고 나중에 N건의 객체에 대해 각각 다시 쿼리를 보내서 해당하는 데이터를 가져오는 것이다. Java Spring에서는 Join Fetch 등의 방법을 통해서 이러한 N+1 쿼리 문제를 해결..

Python/FastAPI 2023.10.09