Запрос значений с плавающей запятой в 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 и подклассифицированный Numpy.ndarray плавно и в виде pythonic?
  • Значение по умолчанию для столбца сохраняется в таблице
  • Поведение удаления с отношением
  • SQL Alchemy ORM возвращает один столбец, как избежать обычной обработки сообщений
  • Как получить строки, которые соответствуют списку 3-х кортежей с SQLAlchemy
  • Доля моделей sqlalchemy между флягой и другими приложениями
  • Может ли SQLAlchemy's session.merge () обновить свой результат с новыми данными из базы данных?
  • SqlAlchemy не будет принимать значение datetime.datetime.now в столбце DateTime
  •  
    Interesting Posts for Van-Lav

    Получение `django-registration` для отправки вам на страницу, с которой вы изначально пытались посетить

    Проверка состояния QValidator

    Как выбрать ячейки больше, чем значение в многоиндексном кадре данных Pandas?

    Pandas выравнивает несколько фреймов данных с индексом TimeStamp

    Планирование бронирования (а не ресторана) с помощью python

    TensorFlow REST Frontend, но не TensorFlow Обслуживание

    Python noob здесь: на веб-сервере с включенным Python как использовать Python?

    Pandas, groupby и нахождение максимума в группах, возвращающее значение и количество

    Python – IOError: Нет такого файла или каталога: u'lastid.py 'для файла в том же каталоге. Работает на месте, не на Хереку

    Чтение текстового файла и разбиение его на отдельные слова в python

    Почему иногда подпроцесс Python не смог получить правильный код выхода после запуска процесса?

    Каррирование в обратном порядке в python

    Почему функция «len» не унаследована словарями и списками в Python

    spark-submit продолжает зависать после завершения работы

    Как вернуть страницу ошибки apache из приложения wsgi?

    Python - лучший язык программирования в мире.