ホームページ >バックエンド開発 >Python チュートリアル >SQLAlchemy でのデバッグ中に実際の SQL クエリを値とともに出力するにはどうすればよいですか?

SQLAlchemy でのデバッグ中に実際の SQL クエリを値とともに出力するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-18 13:29:03395ブラウズ

How to Print Actual SQL Queries with Values During Debugging in SQLAlchemy?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。