この記事について
| 環境 | 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() に書き換えなくてもよい。
