나는 이렇게 학습한다/Library

SQLAlchemy에서의 비동기 쿼리 (feat. 2.0 Style)

daco2020 2022. 4. 24. 23:52
반응형

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을 적용해보시기 바랍니다!

 

 

 

 


 

 

 

레퍼런스

 

Asynchronous I/O (asyncio) — SQLAlchemy 1.4 Documentation

Asynchronous I/O (asyncio) Support for Python asyncio. Support for Core and ORM usage is included, using asyncio-compatible dialects. Tip The asyncio extension as of SQLAlchemy 1.4.3 can now be considered to be beta level software. API details are subject

docs.sqlalchemy.org

 

 

» SQLAlchemy 2.0 Style 이 반가운 이유

라인웍스는 방대한 의료데이터속에 숨겨진 무한한 가치를 발견하는 헬스케어 빅데이터 스타트업입니다.

blog.linewalks.com

 

 

 

 

반응형