코드로 우주평화
SQLAlchemy에서의 비동기 쿼리 (feat. 2.0 Style) 본문
AsyncSession을 통한 비동기 DB 통신
SQLAlchemy 에서는 DB와 비동기로 통신하기 위해서 AsyncSession 을 사용합니다.
그런데 AsyncSession을 사용하게 되면 ORM방식도 바뀌는데요.
SQLAlchemy 공식문서에서는 2.0 스타일 쿼리를 사용한다고 합니다.
Synopsis - ORM
Using 2.0 style querying, the [AsyncSession] class provides full ORM functionality. Within the default mode of use, special care must be taken to avoid lazy loading or other expired-attribute access involving ORM relationships and column attributes.
그렇다면 2.0 스타일 쿼리를 한번 간단하게 살펴보겠습니다.
SQLAlchemy 2.0 스타일 쿼리
우선 기존 ORM처럼 2.0 쿼리 또한 세션을 이용합니다.
(세션 생성에 대한 내용은 생략하겠습니다)
기존 ORM과 함께 select문을 비교해보겠습니다.
'''
유저 id 1번의 인스턴스를 반환하겠습니다.
'''
# 기존 ORM
result = session.query(User).filter(User.id == 1).first()
return result
# 2.0 Style
from sqlalchemy import select
query = select(User).where(User.id == 1)
result = await session.execute(query)
return result.scalar()
기존 ORM의 경우
세션에서 query와 filter, first 메서드를 사용하여 해당 되는 인스턴스를 가져왔습니다.
(여기서 first는 첫번째 매칭되는 인스턴스만 달라는 뜻입니다)
2.0 Style의 경우
select를 추가로 import하여 쿼리를 생성합니다.
그리고 session.execute()메서드 안에 만든 쿼리를 넣어줍니다.
비동기 이므로 앞에 await을 적어주세요!
마지막으로 반환된 값에 scalar() 또는 scalars().first() 을 붙여줍니다.
이제 인스턴스의 값을 정상적으로 반환할 수 있습니다!
(만약 인스턴스가 복수라면 scalars().all()로 적어주세요)
정리
위에서 간단히 select 쿼리를 살펴보았습니다.
사실 2.0 style 이전에도 query를 생성하여 execute하는 방식이 있었습니다.
그런데 버전이 2.0으로 업그레이드 되면서 직관성과 유지보수성이 더 높아졌다고 합니다.
게다가 SQLAchemy에서 비동기IO는 2.0 style을 사용해야하니
비동기로 DB 통신을 구현할 예정이라면 2.0 style을 적용해보시기 바랍니다!
레퍼런스
'나는 이렇게 학습한다 > Library' 카테고리의 다른 글
Pytest _ client 에서 parmas 값 넣는 방법 (0) | 2022.04.27 |
---|---|
SQLAlchemy 1.x 와 2.0의 Query 스타일 비교 (0) | 2022.04.25 |
SQLAlchemy를 이용해 csv파일 DB업로드 하는 방법(feat. psql) (2) | 2022.04.21 |
SQLAlchemy, ‘PasswordType’으로 손쉽게 암호화하자 (0) | 2022.04.12 |
Poetry로 프로젝트 패키지를 관리하자 (0) | 2022.04.11 |