2012-07-02 2 views
0

Я хочу использовать переменную, как это:Использование переменной в SQLAlchemy фильтр

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

У меня тогда никаких результатов, когда я применяю все() к 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 на его значение, все в порядке.

+0

Сюрприз! Если я заменю последнюю строку, а одну на коэффициент 1 = 0,93, она работает ... – Oodini

+0

Когда я устанавливаю factor1 = 0.93, его значение в запросе равно 0.93000000000000005. Когда я устанавливаю factor1 = 1-0.07, его значение в запросе равно 0.92999999999999994. Значение в базе данных составляет 0,93 * 1000. – Oodini

ответ

-1

Я просто проверял что-то похожее на код, который вы описываете, но получить результаты, использую ли я переменный или буквальный:

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

против

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

Вы можете разместить дословный SQL, который размножается? то есть результаты

print myQuery 

для обоих из них?

+0

Ну, это немного сложнее ... Может быть, я ошибаюсь. Я поместил исходный код в начальный пост. – Oodini

+0

Ваш код не совпадает! Ваш код работает, потому что в IEEE float 0.5 является точным (он равен 0,1 как двоичный), тогда как 0.03 не может быть представлен точно в двоичном формате. –

1

Номера с плавающей точкой IEEE, используемые Python, и многие базы данных не всегда работают как ваша школьная математика. Причина, по которой работала 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 ...

Одним из решений может быть использование decimal.Decimal в Python и Numeric в SQL.

Смежные вопросы