2014-02-12 16 views
0

由於將有缺陷的sql查詢直接粘貼到數據庫管理工具(如phpmyadmin)中可能很有效,直到它返回預期的結果, 有沒有什麼辦法可以檢索最終的sql語句Sqlalchemy Core應該將其傳遞給MySql數據庫,並且可以立即執行?檢索最終的sql查詢語句(使用值代替任何'?')

+0

我有被複制從金字塔控制檯記錄器的SQL查詢最近的(它沒有替換'?'),但在它之後還包括它使用的值。然後,我將這些複製/粘貼到相應的位置放入查詢中,以便我可以運行它。這確實是一些文本操作。 –

回答

1

這通常意味着您要綁定的參數以內聯方式呈現。有有限支持這種自動(截至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))