1. ホーム
  2. python

[解決済み] SQLAlchemy の式から、コンパイルされた生の SQL クエリを得るにはどうしたらいいですか?

2022-05-06 16:41:04

質問

SQLAlchemy のクエリオブジェクトを持っていて、コンパイルされた SQL 文のテキストを、すべてのパラメータを束ねた状態で取得したいのです(たとえば、no. %s またはステートメントコンパイラや MySQLdb 方言エンジンなどによってバインドされるのを待っているその他の変数)。

呼び出し str() をクエリで実行すると、次のようなことがわかります。

SELECT id WHERE date_added <= %s AND date_added >= %s ORDER BY count DESC

query._paramsの中を見てみましたが、空のdictになっています。 を使って自作のコンパイラを書きました。 この例の sqlalchemy.ext.compiler.compiles デコレーター が、そこのステートメントでもまだ %s のように、データが欲しいところ。

クエリオブジェクトを調べると、常に空の辞書になっています(クエリは正常に実行され、エコーロギングをオンにするとエンジンはそれを出力しますが)。

SQLAlchemy は、基礎となるクエリを私に知られたくないのだ、なぜなら、式 API のインターフェイスの一般性を、すべての異なる DB-API で壊すからだ、というメッセージを私は受け取り始めています。 私は、クエリが何であるかを知る前に実行されたとしても気にしません。

どのように解決するのですか?

これは のブログで、最新の回答が掲載されています。

ブログの記事から引用すると、これが提案され、私の場合はうまくいきました。

>>> from sqlalchemy.dialects import postgresql
>>> print str(q.statement.compile(dialect=postgresql.dialect()))

ここで、qは次のように定義される。

>>> q = DBSession.query(model.Name).distinct(model.Name.value) \
             .order_by(model.Name.value)

または任意の種類の session.query() .

Nicolas Cadouさん、回答ありがとうございました。ここで検索してくる他の人の役に立てれば幸いです。