2012-01-12 58 views
2

我在渦輪增壓器控制器中動態添加和子句,一切正常,直到我到達日期列,它似乎無法評估表達式,因爲我得到渦輪機中的「ProgrammingError」。這是代碼:sqlalchemy:and_和條款列表中的日期函數的評估

terms = ["create_time<=DateTime('2012-01-01')"] 
records = DBSession.query(myrecords).filter(and_(*terms)) 

,如果我做這樣的工作原理:

records = DBSession.query(myrecords).filter(and_(create_time<=DateTime('2012-01-01'))) 

它是什麼,我俯瞰?

感謝

+0

你的'* terms'會將一個字符串解析爲'和_()',而你的「作品」解析了一個不同的表達式。也許這就是爲什麼他們工作不同? – 2012-01-12 00:28:15

+0

是的,我只是檢查了一下,似乎子句列表只會對簡單的比較有用......除非我這樣做:and_(eval(* terms)) – 2012-01-12 00:32:32

+0

您可以嘗試'eval()',但那永遠不是良好的做法:P – 2012-01-12 00:33:39

回答

2

你需要發送的表達構建體,只是失去了引號:

terms = [create_time<=DateTime('2012-01-01')] 
records = DBSession.query(myrecords).filter(and_(*terms)) 

像別人說的,如果你實際上是從其他來源得到的字符串,你需要通過eval()運行它們。確保這些字符串不是來自外部世界! eval()需要非常小心地使用,以防止未經授權的代碼執行。