How to make a subquery in sqlalchemy

서브쿼리 만들기

 

subquery = session.query(A.id).filter(A.something==2000).subquery()
query = session.query(B).filter(B.something1.in_(subquery))

or

subquery = session.query(A.id).filter(A.something==2000).subquery()
query = session.query(B).\
          filter(B.somethings.in_(subquery)).\
          update({"key": value}, synchronize_session='fetch')

 

---

synchronize_session=evaluate

파이썬에 생성된 쿼리를 곧바로 평가해서 세션으로부터 제거되어야 할 객체를 결정한다. evaluate는 기본값이고 효율적이지만, 견고하지 않고 복잡한 쿼리는 evaluate될 수 없다. 만약 쿼리를 evaluate할 수 없다면, sqlalchemy.orm.evaluator.UnevaluatableError를 발생시킨다.

synchronize_session=fetch

삭제되기 전에 select 쿼리를 수행하고 해당 결과를 사용해서 어떤 객체들이 세션에서 삭제되어야 할지 결정한다. 덜 효율적이지만 유효한 쿼리를 다룰 수 있게 된다.

synchronize_session=False

세션 갱신을 시도하지 않기 때문에 매우 효율적이다. 그러나 삭제한 후에 세션을 사용하려고 하면 부정확한 결과를 얻을 수 있다.

반응형

'SW ENGINEERING > SqlAlchemy' 카테고리의 다른 글

[SQLAlchemy] update  (0) 2022.03.08
[SQLAlchemy] flush vs commit  (0) 2022.03.08
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기