Запрос значений с плавающей запятой в SQLAlchemy

Чтобы суммировать проблему, я не могу выбрать какой-либо объект против значения с плавающей запятой, используя SQLAlchemy.

Например:

m = session.query(Model).get(1); all_m = session.query(Model).filter(Model.some_float_value, m.some_float_value) 

all_m пуст, пока я ожидаю, что он всегда будет иметь хотя бы один!

Как я могу отфильтровать значение float в SQLAlchemy на основе произвольной точности (например, некоторые из них могут совпадать с 0.01 или другими, которые я могу фильтровать с точностью до 0,0005).

Например, я хочу иметь возможность написать общую функцию, чтобы я мог писать такие запросы в моем коде:

 session.query(Model)\ .filter(Model.foo == "bar", match_float(Model.some_float_value, float_val, 0.025)).all() 

Там, где допускается соответствие матчей в пределах приблизительного допуска 0,025.

Однако я не очень хорошо разбираюсь в SQLAlchemy и не смог найти документацию о том, как создать пользовательскую функцию сравнения или любые встроенные функции, которые будут делать то, что мне нужно.

Есть ли встроенная функция, которую я могу использовать, способ предоставления пользовательской функции сравнения для метода фильтра, или я могу написать для этого необработанный запрос / процедуру?

Дополнительная информация:

Postgres 9.2

SQLAlchemy 0.9

Значения хранятся в виде двойной точности с плавающей запятой

Все модели были определены так (их много, что делает решение с явными определениями столбцов менее желательным):

 engine = create_engine('postgresql://user:pass@localhost:1234/database') Base = declarative_base() metadata = MetaData(bind=engine) class Model(Base): __table__ = Table('model', metadata, autoload=True) 

редактировать

Я полностью переформулировал свой вопрос для ясности. Извините за путаницу, я не общаюсь с людьми …

2 Solutions collect form web for “Запрос значений с плавающей запятой в SQLAlchemy”

Один конкретный пример пользовательских сравнений показан в GeoAlchemy (хотя это может быть излишним для вашего приложения). Хотя примеры в приведенной ниже ссылке используют ограничивающие поля для сравнения пространственных координат, вы можете использовать более простой подход для реализации сравнения в пределах допуска.

См., Например, класс Comparator, который определяет здесь «~ =» и другие операторы:

http://geoalchemy-2.readthedocs.org/en/0.2.4/spatial_operators.html

Поскольку вы упоминаете, что не смогли найти документацию о том, как реализовать пользовательскую функцию сравнения, см. Здесь:

http://docs.sqlalchemy.org/en/latest/core/types.html#types-operators

В соответствующей заметке – если вы хотите предотвратить запуск обновлений базы данных, если столбец с плавающей точкой остается в пределах некоторого порога, см. Обсуждение здесь:

https://groups.google.com/forum/#!msg/sqlalchemy/tCpsGZmjk_w/lOwW93qHV0sJ

(Отказ от ответственности: это основано на поиске google, я новичок в SQLAlchemy)

Одним из правил для чисел с плавающей запятой является «Никогда не сравнивать числа с плавающей запятой для равенства». (Вы можете указать Google.)

Простейшим и наиболее предсказуемым способом является использование типа данных decimal (n, m) SQL вместо float. Тип данных десятичного числа (n, m) SQL не содержит ошибок приближения.

SQLAlchemy поддерживает дескрипторы SQL .

Если вы должны работать с удвоениями, лучший выбор – это, вероятно, следовать одному из двух методов, рекомендованных в FAQ по C.

Одна из проблем с расчетом неравенства (abs(ab) >= 0.01) заключается в том, что результат будет вычисляться с использованием ближайших приближений с плавающей запятой к a и b . Эти аппроксимации с плавающей запятой могут быть точно такими, какие вы ожидаете от них, но это зависит от приложения. (Десятичные значения 45.06 и 45.062 – это не то, что вы ожидаете от них, когда они назначены двойнику. Другими словами, ближайшее приближение с плавающей запятой до 45.06 не является 45.06).

В FAQ C часто говорят об использовании такого выражения как универсального способа определения равенства.

  • Лучший способ сделать перечисление в Sqlalchemy?
  • flask-admin form: Constrain Значение поля 2 в зависимости от значения поля 1
  • QuerySelectField работает на одном сервере, разбивается на другой с тем же кодом
  • SQLAlchemy - ForeignKey не может найти таблицу
  • Каков хороший общий способ просмотра транзакций SQLAlchemy, в комплекте с аутентифицированным пользователем и т. Д.?
  • Сделать SQLAlchemy COMMIT вместо ROLLBACK после запроса SELECT
  • Недостаток метакласса SqlAlchemy
  • SQLAlchemy: как удалить несколько строк без запроса
  • Flask-SqlAlchemy рассматривает отражение
  • Триггер в sqlachemy
  • SQLAlchemy: объединение данных таблицы с помощью внешних ключей
  • Python - лучший язык программирования в мире.