flask-sqlalchemyで生成されるsql文を文字列として取得する方法

この記事について

環境Python + Flask + flask-sqlalchemy(MySQL)
目的ORMが生成するSQL文を文字列として取得する
結果statement.compile(dialect=mysql.dialect()) で取得できた

次のsql文を実行するときに生成されるsql文を文字列として取得したい

db.session.query(User).all()

開発環境
python
flask
flask-alchemy

db.session.query(User).all()とQuery(User).with_session(db.session)は同じ結果を返すので後者に置き換える。

両者の違い

db.session.query(User).all() は、SQLAlchemyのセッションオブジェクトである db.session を使用。
Query(User).with_session(db.session) は、SQLAlchemyのクエリオブジェクトを使用して、データベースから User モデルのすべてのレコードを取得するために使用される。これは、セッションオブジェクトをクエリに渡すことで実行される。

from sqlalchemy.dialects import mysql

from sqlalchemy.orm import Query



query = Query(User).with_session(db.session)

# SQLAlchemyのdialectsモジュールを使用して、MySQLのdialectを取得し、SQLAlchemyのcompile()メソッドを使用して、SQL文をコンパイル

statement = query.statement.compile(dialect=mysql.dialect())

sql = str(statement)

return sql

db.session.query(User).statement でも同じstatementが取れるので、compileするだけなら Query(…).with_session() に書き換えなくてもよい。

タイトルとURLをコピーしました