코드로 우주평화

SQLAlchemy 1.x 와 2.0의 Query 스타일 비교 본문

나는 이렇게 학습한다/Library

SQLAlchemy 1.x 와 2.0의 Query 스타일 비교

daco2020 2022. 4. 25. 19:39
반응형

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

 

 

 

반응형