Как использовать математические уравнения в качестве фильтров в SQLAlchemy - PullRequest
2 голосов
/ 04 января 2010

Я использую SQLAlchemy ORM для построения запросов MySQL в моем приложении и прекрасно могу добавить базовые фильтры к запросу, например так:

query = meta.Session.query(User).filter(User.user_id==1)

Что дает мне нечто в основном эквивалентное этому:

SELECT * FROM users WHERE user_id = 1

Мой вопрос заключается в том, как бы интегрировать некоторые базовые математические функции MySQL в мой запрос. Например, я хотел, чтобы пользователи находились рядом с определенной широтой и долготой. Поэтому мне нужно сгенерировать этот SQL ($ mylatitude и $ mylongitude - это статическая широта и долгота, с которыми я сравниваю):

SELECT * FROM users 
WHERE SQRT(POW(69.1 * (latitude - $mylatitude),2) + POW(53.0 * (longitude - $mylongitude),2)) < 5

Есть ли способ, которым я могу включить эти функции в запрос, используя SQLAlchemy ORM?

Ответы [ 2 ]

5 голосов
/ 05 января 2010

Вы можете использовать буквенный SQL в своем фильтре, см. Здесь: http://www.sqlalchemy.org/docs/05/ormtutorial.html?highlight=text#using-literal-sql

Например:

clause = "SQRT(POW(69.1 * (latitude - :lat),2) + POW(53.0 * (longitude - :long),2)) < 5"
query = meta.Session.query(User).filter(clause).params(lat=my_latitude, long=my_longitude)
3 голосов
/ 05 января 2010

Я бы использовал интерфейс построителя запросов и конструктор функций func SQL, чтобы абстрагировать вычисление как функцию. Таким образом, вы можете свободно использовать его с псевдонимами или объединениями.

User.coords = classmethod(lambda s: (s.latitude, s.longitude))

def calc_distance(latlong1, latlong2):
    return func.sqrt(func.pow(69.1 * (latlong1[0] - latlong2[0]),2)
                   + func.pow(53.0 * (latlong1[1] - latlong2[1]),2))

meta.Session.query(User).filter(calc_distance(User.coords(), (my_lat, my_long)) < 5)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...