[오늘의 배움] 044 SQLAlchemy

이상민·2021년 2월 10일
1

[오늘의 배움]

목록 보기
47/70
post-thumbnail

1. session.query vs model.query

SQLAlchemy에서 쿼리할 때 어떤 때는 session.query(), 또 어떤때는 모델명.query로 하던데 둘의 차이가 뭔지 궁금해서 검색해봤다.

1-1. session.query

# 예시
db.session.query(Posts).filter(Posts.user_id.in_(follow_id_list)).all()

SQLAlchemy ORM에서 질의할때 사용하는 기본적인 표현으로 session.query(모델명.속성) 형태로 사용한다. Session이란 트랜잭션이 커밋되기 전 동작들이 거쳐가는 일종의 버퍼 같은 것이다. 이것이 있어서 커밋 안된 데이터가 다른 트랜잭션으로 흘러들어가거나, 같은 테이블의 인스턴스를 두번 불러왔을 때 다른 객체로 인식되는 등의 문제가 없다 (이외 기타 active record 방식에서의 문제점을 해결한다).
SQLAlchemy session 참고 : https://www.youtube.com/watch?v=uAtaKr5HOdA

1-2. model.query

# 예시
Posts.query.filter(Posts.user_id.in_(follow_id_list)).all()

모델명.query 형태로도 질의할 수 있다. 기본적으로 지원하지는 않고 모델에 아래처럼 모델 클래스에 query 속성을 추가해줘야 사용할 수 있다. Flask-sqlalchemy에선 db.Model을 상속해서 모델을 만드는데 이때 db.Model 클래스에 query 속성이 이미 구현되어 있어서 바로 사용가능하다.

class Posts(object):
	...
	query = db_session.query_property()

1-3. 차이점 정리

  • session.query : 기본 질의 방법. 특정 애트리뷰트만 질의하는 것도 가능하다.
  • model.query : 모델을 수정해야 사용할 수 있다. 가독성이 좋고 코드도 짧다.

특정 애트리뷰트 혹은 여러 테이블에서 질의를 하지않는 이상 취향의 차이인것 같다.


2. session.query named tuple

session.query(Users.name).all()

위처럼 특정 애트리뷰트만 질의시 [('user1',), ('user2',)] 같이 named tuple 형태로 반환한다. named tuple은 자료형 중 하나로 tuple과 비슷하지만 인덱스 외에 키값으로도 데이터에 접근할 수 있다. 이런 질의 결과에서 실제 Users.name에 해당하는 데이터만 뽑아 리스트로 만드려면 아래와 같이 해야한다.

[name for name, in session.query(Users.name)]
profile
편하게 읽기 좋은 단위의 포스트를 추구하는 개발자입니다

0개의 댓글