코드로 우주평화
SQLAlchemy 1.x 와 2.0의 Query 스타일 비교 본문
SQLAlchemy 2.0
SQLAlchemy 2.0에서는 query를 생성할 때 2.0 스타일을 사용할 수 있습니다.
2.0 스타일은 기존의 Session.query()가 아닌 select() 등의 메소드로 생성한 쿼리를 Session.execute()로 전달하여 DB와 통신할 수 있습니다.
현재 공식문서에서는 기존 스타일의 ORM을 제거할 계획은 없다고 하며, 어떤 스타일이든 함께 사용할 수 있다고 합니다.
다만, SQLAlchemy를 비동기로 구현할 경우 AsyncSession 클래스는 Session.query()를 지원하지 않으므로 2.0 스타일을 사용해야합니다.
Within the ORM, 2.0 style query execution is supported, using select() constructs in conjunction with AsyncSession.execute(); the legacy Query object itself is not supported by the AsyncSession class.
# https://docs.sqlalchemy.org/en/14/changelog/migration_14.html#change-5159
아래 표는 공식문서에서 가져온 스타일 비교 표입니다.
사용하려는 스타일의 예시 코드를 보고 적용하시기 바랍니다.
만약 더 자세히 알고 싶다면 레퍼런스 링크를 통해 확인하실 수 있습니다.
1.x 스타일 | 2.0 스타일 | 레퍼런스 |
session.query(User).get(42) | session.get(User, 42) | ORM Query - get() method moves to Session |
session.query(User).all() | session.execute( select(User) ).scalars().all() # or session.scalars(select(User)).all() |
ORM Query Unified with Core Select Session.scalars() Result.scalars() |
session.query(User).\ filter_by(name='some user').one() |
session.execute( select(User). filter_by(name="some user") ).scalar_one() |
ORM Query Unified with Core Select Result.scalar_one() |
session.query(User).\ filter_by(name='some user').first() |
session.scalars( select(User). filter_by(name="some user"). limit(1) ).first() |
ORM Query Unified with Core Select Result.first() |
session.query(User).options( joinedload(User.addresses) ).all() |
session.scalars( select(User). options( joinedload(User.addresses) ) ).unique().all() |
ORM Rows not uniquified by default |
session.query(User).\ join(Address).\ filter(Address.email == 'e@sa.us').\ all() |
session.execute( select(User). join(Address). where(Address.email == 'e@sa.us') ).scalars().all() |
ORM Query Unified with Core Select Joins |
session.query(User).from_statement( text("select * from users") ).all() |
session.scalars( select(User). from_statement( text("select * from users") ) ).all() |
Getting ORM Results from Textual and Core Statements |
session.query(User).\ join(User.addresses).\ options( contains_eager(User.addresses) ).\ populate_existing().all() |
session.execute( select(User). join(User.addresses). options(contains_eager(User.addresses)). execution_options(populate_existing=True) ).scalars().all() |
ORM Execution Options Populate Existing |
session.query(User).\ filter(User.name == 'foo').\ update( {"fullname": "Foo Bar"}, synchronize_session="evaluate" ) |
session.execute( update(User). where(User.name == 'foo'). values(fullname="Foo Bar"). execution_options(synchronize_session="evaluate") ) |
UPDATE and DELETE with arbitrary WHERE clause |
session.query(User).count() | session.scalar(select(func.count()).select_from(User)) session.scalar(select(func.count(User.id))) |
Session.scalar() |
레퍼런스
2.0 에 대한 전반적인 내용
Migrating to SQLAlchemy 2.0 — SQLAlchemy 1.4 Documentation
Previous: What’s New in SQLAlchemy 1.4? Next: 1.4 Changelog Up: Home On this page: Migrating to SQLAlchemy 2.0 Overview 2.0 Migration - Core Connection / Transaction 2.0 Migration - Core Usage 2.0 Migration - ORM Configuration 2.0 Migration - ORM Usage 2
docs.sqlalchemy.org
ORM 쿼리 가이드
ORM Querying Guide — SQLAlchemy 1.4 Documentation
The select() construct accepts ORM entities, including mapped classes as well as class-level attributes representing mapped columns, which are converted into ORM-annotated FromClause and ColumnElement elements at construction time. A Select object that con
docs.sqlalchemy.org
'나는 이렇게 학습한다 > Library' 카테고리의 다른 글
SQLAlchemy _ add() 와 add_all() 사용법과 차이점 (0) | 2022.05.02 |
---|---|
Pytest _ client 에서 parmas 값 넣는 방법 (0) | 2022.04.27 |
SQLAlchemy에서의 비동기 쿼리 (feat. 2.0 Style) (0) | 2022.04.24 |
SQLAlchemy를 이용해 csv파일 DB업로드 하는 방법(feat. psql) (2) | 2022.04.21 |
SQLAlchemy, ‘PasswordType’으로 손쉽게 암호화하자 (0) | 2022.04.12 |