首頁  >  文章  >  後端開發  >  如何在 SQLAlchemy 偵錯期間列印帶有值的實際 SQL 查詢?

如何在 SQLAlchemy 偵錯期間列印帶有值的實際 SQL 查詢?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-10-18 13:29:03272瀏覽

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

調試SQLAlchemy 查詢:使用值列印實際SQL

調試SQLAlchemy 表達式時,查看正在執行的實際SQL 查詢非常有價值,包括特定值而不是綁定定參數。雖然 SQLAlchemy 沒有為此提供明確方法,但有幾種方法可以實作它。

一般方法

在大多數情況下,您可以簡單地在SQLAlchemy 語句上呼叫str()或查詢:

print(str(statement))

這適用於ORM 查詢(查詢物件)和純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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn