2012-01-12 63 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()需要非常小心地使用,以防止未经授权的代码执行。