調試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中文網其他相關文章!