0
由於將有缺陷的sql查詢直接粘貼到數據庫管理工具(如phpmyadmin)中可能很有效,直到它返回預期的結果, 有沒有什麼辦法可以檢索最終的sql語句Sqlalchemy Core應該將其傳遞給MySql數據庫,並且可以立即執行?檢索最終的sql查詢語句(使用值代替任何'?')
由於將有缺陷的sql查詢直接粘貼到數據庫管理工具(如phpmyadmin)中可能很有效,直到它返回預期的結果, 有沒有什麼辦法可以檢索最終的sql語句Sqlalchemy Core應該將其傳遞給MySql數據庫,並且可以立即執行?檢索最終的sql查詢語句(使用值代替任何'?')
這通常意味着您要綁定的參數以內聯方式呈現。有有限支持這種自動(截至SQLA 0.9這將工作):
from sqlalchemy.sql import table, column, select
t = table('x', column('a'), column('b'))
stmt = select([t.c.a, t.c.b]).where(t.c.a > 5).where(t.c.b == 10)
print(stmt.compile(compile_kwargs={"literal_binds": True}))
還你可能希望查詢的MySQL特定的,所以如果你已經有一個引擎躺在你身邊能通過在太:
from sqlalchemy import create_engine
engine = create_engine("mysql://")
print(stmt.compile(engine, compile_kwargs={"literal_binds": True}))
和它打印:
SELECT x.a, x.b
FROM x
WHERE x.a > 5 AND x.b = 10
現在,如果你在參數更詳細的值,比如d ates,SQLAlchemy可能會引發錯誤,它只針對數量有限的類型具有「字面綁定」渲染器。繞過該系統代替,讓您在打開這些參數轉換爲字符串,然後做一個漂亮的直接射門的方法一個Statement對象上的「查找和替換」,用文本字符串替換的約束參數:
from sqlalchemy.sql import visitors, literal_column
from sqlalchemy.sql.expression import BindParameter
def _replace(arg):
if isinstance(arg, BindParameter):
return literal_column(
repr(arg.effective_value) # <- do any fancier conversion here
)
stmt = visitors.replacement_traverse(stmt, {}, _replace)
一旦你這樣做,你可以只打印:
print(stmt)
或MySQL的版本:
print(stmt.compile(engine))
我有被複制從金字塔控制檯記錄器的SQL查詢最近的(它沒有替換'?'),但在它之後還包括它使用的值。然後,我將這些複製/粘貼到相應的位置放入查詢中,以便我可以運行它。這確實是一些文本操作。 –