SQLAlchemyが生成するクエリを確認する

Python

この記事は最終更新日から1年以上が経過しています。

WIZY の開発では、Python + MySQLの構成でORマッパーに SQLAlchemy を使用しています。
SQLAlchemyは高機能なのですがまとまったドキュメントがなく、また「どのようにコードを記述したらどのようなクエリが発行されるのか」というのはDB設計やユースケースがサンプルとは異なるので、運良くマッチした情報が出て来ない限り自分でクエリ(を生成するコード)を組み立てる必要があります。

パターン1) loggingでログに出力する

SQLAlchemyを利用しているアプリケーションで以下のコードを記述することでクエリをログに出力することができます。

パターン2) mysql用にクエリをコンパイル

パターン1はクエリに渡した変数が出力されない問題があります。
変数を含むクエリ全体を確認したい場合はクエリをコンパイルして確認する方法が使えます。

実行結果

コンパイルに渡している dialect でMySQLの文法で変換すること、
compile_kwargs={"literal_binds": True} で変数をセットした状態で表示することを示しています。

Flask-SQLAlchemyを使用した場合

WebフレームワークFlaskとSQLAlchemyを利用する場合はFlask-SQLAlchemyが利用できます。
この場合に同じことをするには、Flask-Scriptも使用して以下のようになります。

実行結果

まとめ

ORマッパーを使用していても複雑な条件を利用したい場合は実際に出力されるSQLを確認しながら開発を進めることで、予想外の動きやケース漏れを防ぐことができると思います。

Python