如何在SQLAlchemy中使用数学方程作为过滤器

时间:2010-01-04 20:29:17

标签: python mysql orm sqlalchemy

我正在使用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 个答案:

答案 0 :(得分:5)

您可以在过滤器中使用文字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)

答案 1 :(得分:3)

我将使用查询构建器接口和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)