2011-09-14 79 views
3

我創建了一個功能,用於創建表達如何在sqlalchemy中創建基於字面值的查詢?

def test(operator1, operation, operator2): 
    return literal_column(operator1).op(operation)(operator2) 

現在,當我把它與

test(1, '=', 1) 

然後它

但是當我通過

test('abc', '=', 'abc') 

然後它給錯誤,abc不是列。

我試圖將其轉換

def test(operator1, operation, operator2): 
    return literal_column(operator1, String).op(operation)(operator2) 

但是,這是行不通的。

如果我

test("'abc'", '=', 'abc') 

調用這工作有什麼辦法,得到關於基地我們可以創建literal_colum這將是地圖,相同類型的內容算子1和類型?

回答

2

任何文字值可以被轉換成一個表達構建體:

from sqlalchemy import literal_column, bindparam 


# ? = ?, 1 will be bound 
bindparam(1) == bindparam(1) 

# " 1 = 1", literals rendered inline (no quoting is applied !!) 
literal_column(str(1)) == literal_column(str(1)) 
+1

當我使用像bindparam綁定PARAMS(1)== bindparam(1),然後我得到'FROM用戶 其中%s =%s的(1,)== literal_column('1')我得到 ' FROM users WHERE 1 = 1 2011-09-16 10:59:49,835 INFO sqlalchemy.engine.base.Engine() ' 這將適用於整數,但對於它給出的字符串錯誤並轉換int 'FROM users WHERE abc = abc 2011-09-16 10:59:49,835 INFO sqlalchemy.engine.base.Engine() ' – Nilesh

+1

它假定您在此處使用execute()的機制使用子句構造。如果你只是在執行str(子句)然後使用它,那麼你會失去綁定參數值,但你有點超出了API的常規使用模式。如果你想使用literal_column和字符串,你必須安全地引用它。我建議不要這樣做,我會盡可能地堅持http://www.sqlalchemy.org/docs/core/tutorial.html中的模式。 – zzzeek

+0

Thx爲您提供幫助。如果有任何更好的想法,請發佈。我將用字符串變量添加引號。 :) – Nilesh

相關問題