ホームページ >バックエンド開発 >Python チュートリアル >SQLAlchemy で実行された実際の SQL クエリを取得するにはどうすればよいですか?

SQLAlchemy で実行された実際の SQL クエリを取得するにはどうすればよいですか?

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

How to Obtain the Actual SQL Query Executed in SQLAlchemy?

SQLAlchemy で実際の SQL クエリを出力する

SQLAlchemy で SQL クエリを実行するには、SQL インジェクション攻撃を防ぐためにパラメータをバインドする必要があります。ただし、値を含む実際の SQL クエリを取得するのは困難な場合があります。

一般的な解決策

SQL クエリを文字列として取得する最も簡単な方法は、次の方法です。 str() 関数:

<code class="python">print(str(statement))  # for both ORM Query and SQL statements</code>

バインドされたパラメーターの実装

デフォルトでは、SQLAlchemy はセキュリティ上の理由からパラメーターをバインドします。この動作は、compile_kwargs の literal_binds フラグを使用して抑制できます。

<code class="python">from sqlalchemy.dialects import postgresql

print(
    statement.compile(compile_kwargs={"literal_binds": True})
)</code>

リテラル バインディングは、整数や文字列などの基本型でのみサポートされていることに注意してください。

パラメータ変換のカスタマイズ

より複雑な型を変換する必要がある場合は、process_literal_param メソッドを使用してカスタム TypeDecorator を作成できます:

<code class="python">class MyFancyType(TypeDecorator):
    impl = Integer

    def process_literal_param(self, value, dialect):
        return "my_fancy_formatting(%s)" % value

print(
    tab.select().where(tab.c.x > 5).compile(
        compile_kwargs={"literal_binds": True})
)</code>

これにより、次のようなクエリが生成されます:

<code class="sql">SELECT mytable.x
FROM mytable
WHERE mytable.x > my_fancy_formatting(5)</code>

以上がSQLAlchemy で実行された実際の SQL クエリを取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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