반응형
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
반응형
'Python' 카테고리의 다른 글
Python - JIRA API 로그인 및 검색하기 (0) | 2024.04.12 |
---|---|
Regex - 소/중/대 괄호 이해 (1) | 2024.04.08 |
xz-utils backdoor 백도어 경고/패치 필요, 칼리리눅스등 위험 (0) | 2024.03.31 |
sqlalchemy - connect database Instance Database is not bound to a Session 해결하기 (0) | 2024.03.30 |
VSCode - 쓸만한 무료 코파일럿(Copilot) (0) | 2024.03.26 |