ORM 5

Sqlalchemy 에서 joinedload 할 때, The unique() method must be ... 에러 해결방법

Sqlalchemy 로 ORM 영역에서 join 을 하려고 할 때 joinedload 를 자주 사용한다. 그런데 joinedload 방식은 복수의 ORM 객체를 불러올 때에 다음처럼 에러가 발생할 수 있다. sqlalchemy.exc.InvalidRequestError: The unique() method must be invoked on this Result, as it contains results that include joined eager loads against collections 결론부터 말하자면 메시지의 내용대로 unique() 를 추가하면 된다. 아래처럼 말이다. ... res = await session.execute(stmt) res.scalars().all() # X res.sca..

Pydantic 옵션 하나로 ORM 을 DTO 모델로 변환하기

ORM 에서 DTO 로 모델 변환하기 ORM(Object-Relational Mapping) 객체를 통해 DB의 데이터를 가져왔다면 이를 DTO(Data Transfer Object)를 통해 다른 레이어로 전달하고 싶을 것이다. 이 글에서는 Pydantic 의 from_attributes=True 옵션을 활용하여 손쉽게 DTO를 생성하는 방법을 설명하고자 한다. 본론에 앞서 우선 ORM을 DTO로 변환하는 다양한 방법들을 살펴보자. (본론으로 넘어가고 싶다면 생략해도 좋다) 예를 들어 아래처럼 ORM과 DTO 모델이 명시되어 있다고 해보자. from sqlalchemy import Column, Integer, String from sqlalchemy.ext.declarative import declar..

SQLAlchemy _ ForeignKey 로 연결된 개체 한 번에 삭제하기

SQLAlchemy에서는 cascading 옵션을 활용하여 관계된 개체(Entity)를 한 번에 삭제할 수 있다. 방법 1. 부모 relationship 에서 cascade 매개변수 지정 두 테이블 간의 관계를 정의할 때, 상위 개체와 하위 개체가 함께 삭제되도록 cascade 매개변수를 지정할 수 있다. from sqlalchemy import Column, Integer, ForeignKey from sqlalchemy.orm import relationship class Parent(Base): __tablename__ = 'parent' id = Column(Integer, primary_key=True) children = relationship('Child', cascade='delete') ..

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() cons..

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 relati..