본문 바로가기
Python

SQLalchemy - Query 결과 데이터 Dict로 변환하기

by 올엠 2024. 4. 1.
반응형

SQLalchemy의 쿼리를 이용해서 결과를 보다 다양하게 활용하고자 할때, Key, Value 형식인 Dict로 변환하는것이 유용할 때가 있다.

Dict 형태의 자료형은 Python에서 다양하고, 편하게 활용할 수 있도록 지원해주기 때문에, 필자 역시 이 변환이 가능한지 확인해 보았다.

방법은 총 2가지인데, 하나는 _asdict를 이용한 자동 변환이고, 두번째는 SQLalchemy에서 제공하는 inspect를 이용해서 Dict 형태로 변환하는 방식이다.

1. _asdict 활용

_asdict는 SQLalchemy에서 제공하는 내장 함수 인데, namedtuple을 통해서 Dict 타입으로 변환하게 된다.

import datetime as dt
from sqlalchemy import Text, create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()
Session = sessionmaker()

class Asecurity(Base):
    __tablename__ = 'asecurity'

    name = Column(Text, nullable=False)
    birthday = Column(Date)

engine = create_engine('sqlite://')
Base.metadata.create_all(bind=engine)
Session.configure(bind=engine)

session = Session()
session.add(Asecurity(name='allmnet'))
session.commit()

위와 같이 데이터를 만들었다면, 아래 처럼 ._asdict() 를 활용해서 코드를 사용할 수 있다.

query = session.query(Asecurity.name)
for row in query:
    print(row._asdict())

다만 이 방법은 간혹 object has no attribute '_asdict' 오류로 사용이 되지 않는 경우가 존재 한다.

이때는 inspect를 이용해서 강제로 매핑을 진행해주면 된다.

2. inspect 활용

코드는 필요한 영역에 inspect를 임포트한 이후 key와 attrs를 찾는 함수에 inspect를 이용해서 진행하는 방식이다.

from sqlalchemy import inspect

def object_asdict(self):
    return {c.key: getattr(self, c.key)
            for c in inspect(self).mapper.column_attrs}


query = session.query(Asecurity.name)
for row in query:
    print(object_asdict(row))

 

 

참조

https://docs.sqlalchemy.org/en/20/core/inspection.html

 

Runtime Inspection API — SQLAlchemy 2.0 Documentation

Runtime Inspection API The inspection module provides the inspect() function, which delivers runtime information about a wide variety of SQLAlchemy objects, both within the Core as well as the ORM. The inspect() function is the entry point to SQLAlchemy’

docs.sqlalchemy.org

 

반응형