ホームページ >バックエンド開発 >Python チュートリアル >SQLAlchemy でのデバッグ中に実際の SQL クエリを値とともに出力するにはどうすればよいですか?
SQLAlchemy 式をデバッグするとき、バインド パラメーターの代わりに特定の値を含む、実行されている実際の SQL クエリを確認することは有益です。 。 SQLAlchemy はこれを行うための明示的な方法を提供していませんが、それを実現する方法がいくつかあります。
ほとんどの場合、SQLAlchemy ステートメントで str() を呼び出すだけで済みます。またはクエリ:
print(str(statement))
これは、ORM クエリ (Query オブジェクト) と純粋な SQL ステートメント (select() など) の両方で機能します。
特定のデータベース エンジン用にステートメントをコンパイルする必要がある場合は、compile() メソッドを使用できます:
print(statement.compile(some_engine))
エンジンがない場合は、方言を指定できます:
from sqlalchemy.dialects import postgresql print(statement.compile(dialect=postgresql.dialect()))
特定の状況では、バインドされたパラメータを最終 SQL 文字列にインライン化することができます。これは、literal_binds フラグを使用して実現できます。
print(statement.compile(compile_kwargs={"literal_binds": True}))
これは、整数や文字列などの基本型でのみサポートされていることに注意してください。より複雑な型の場合は、カスタム タイプ デコレータの作成が必要になる場合があります。
サポートされていない型のインライン レンダリングをサポートするには、process_literal_param メソッドを使用してカスタム タイプ デコレータを作成できます。
class MyFancyType(TypeDecorator): ... def process_literal_param(self, value, dialect): return f"my_fancy_formatting({value})"
このデコレータを使用すると、複素数値をインライン化できます:
print(tab.select().where(tab.c.x > 5).compile(compile_kwargs={"literal_binds": True}))
次のような出力が得られます:
SELECT mytable.x FROM mytable WHERE mytable.x > my_fancy_formatting(5)
以上がSQLAlchemy でのデバッグ中に実際の SQL クエリを値とともに出力するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。