【前置き】
・案件で作業中、「SQLAlchemy」を使ってDBのVIEWの値を辞書型(dict)で取得し扱いたかったときに良い記事があまりなかったから備忘録として残すことにした。
※また基本的に「SQLAlchemy」はORMを使って値を取得するのが主流だが今回はSQLを直接実行して辞書型で取得する
【やること】
SQLAlchemyライブラリで取得したVIEWの値を辞書型として扱うようにする
【必要なもの】
〇環境
- Python 3.11
- SQLAlchemy 2.0.13
- 使用DB:「SQL Server 2017 Standard」
【ソース】
- 通常は
session.excute().all()
で取得すると実行結果の値(全件)のみを取得してくる
import sqlalchemy
from sqlalchemy import Engine, Row, create_engine
from sqlalchemy.orm import sessionmaker
def __init__(self, connection_str: str) -> None:
self.engine = create_engine(connection_str, echo=False)
self.session_maker = sessionmaker(autoflush=True, bind=self.engine)
#stmt:VIEWのSELECT文
def get_view_data(self,stmt)-> set[Row]:
with self.session_maker.begin() as session:
return session.execute(stmt).all()
#[{'Taro',20},{'Hanako',19},{'Yukiko',17}]
- しかし
session.excute().mapping().all()
で取得すると...
→[key:value]の辞書型で取得することが出来る!!
def get_view_data(self,stmt)-> set[Row]:
with self.session_maker.begin() as session:
return session.execute(stmt).mapping().all()
#[{'name':'Taro','age':20},{'name':'Hanako','age':19},{'name':'Yukiko','age':17}]
- また普通に辞書型と同じように扱うこともできる!
for p in person:
print("【name】")
print(p["name"])
print("【age】")
print(p["age"])
#【name】
# Taro
# Hanako
# Yukiko
#【age】
# 20
# 19
# 17
【あとがき】
簡単に記載しましたがこれで辞書型で取得が可能となりました。
正直ORMを使えた方がSQLAlchemyを有効活用できるのですがそもそもORMについての土台を理解出来てなかったので今回は直接SQL文を実行しての形となりました。
方法については海外の記事はありましたが日本語での記事が全くないので是非参考にしていただけたら幸いです。
【参考ドキュメント】
- SQLAlchemy2.0ドキュメント
- Qiitaの別記事