我正在使用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将这些函数合并到查询中?
答案 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)