2
2

More than 1 year has passed since last update.

SQLAlchemyで取得した値を辞書型で取得したい

Last updated at Posted at 2023-08-01

【前置き】

・案件で作業中、「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の別記事

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2