在SQLAlchemy过滤器中使用变量

时间:2012-07-02 14:36:20

标签: sqlalchemy

我想使用这样的变量:

myVariable = 0.5
myQuery.filter(myTable.column1 == myVariable*myTable.column2)

当我将all()应用于myQuery时,我没有任何结果。 如果我用它的值替换变量,那就没关系。


queryBidOffer = session.query(BidOffer.id, BidOffer.price, BidOffer.qmin, BidOffer.qmax)
queryBidOffer = queryBidOffer.join(Equipment).filter(BidOffer.equipment==Equipment.id, Equipment.equipment_type.in_(['L','P','W','M']))
queryBidOffer_day = queryBidOffer.filter(BidOffer.day == day)
queryBidOffer_hour = queryBidOffer_day.filter(BidOffer.start_hour == timeSlice)

queryBidOffer_hour = queryBidOffer_hour.join(EquipmentDayHour, BidOffer.equipment == EquipmentDayHour.equipment)
queryBidOffer_hour = queryBidOffer_hour.filter(EquipmentDayHour.day == day)
queryBidOffer_hour = queryBidOffer_hour.filter(EquipmentDayHour.hour == timeSlice)

factor1 = 1.00 - 0.07
queryBidOffer_hour = queryBidOffer_hour.filter(BidOffer.equipment == EquipmentDayHour.equipment, factor1*func.abs(EquipmentDayHour.ref_prog) == 930)

问题在于最后两行(factor1)。 在最后一行中,如果我将factor1替换为其值,则可以。

2 个答案:

答案 0 :(得分:1)

Python使用的IEEE浮点数,许多数据库并不总是像学校的数学一样工作。 0.93工作的原因是,这是您最初存储在数据库中的按位精确值。但减法中会出现轻微错误。

见例如:

>>> print "%0.64f" % (1.0 - 0.07)
0.9299999999999999378275106209912337362766265869140625000000000000
>>> print "%0.64f" % (0.93)
0.9300000000000000488498130835068877786397933959960937500000000000

在这里阅读更多How should I do floating point comparison,然后在非常深入的文章中,您可以阅读What Every Computer Scientist Should Know About Floating-Point Arithmetic ...

一种解决方案可能是在Python中使用decimal.Decimal,在SQL中使用Numeric

答案 1 :(得分:-1)

我刚刚测试了类似于您所描述的代码的内容,但无论是使用变量还是文字都可以获得结果:

myVariable = 0.5
myQuery.filter(myTable.column1 == myVariable*myTable.column2).all()

VS

myQuery.filter(myTable.column1 == 0.5*myTable.column2).all()

你可以发布正在生成的文字SQL吗?即

的结果
print myQuery

对于这两个人?