Python 如何在SQLAlchemy ORM中复制此SQL

Python 如何在SQLAlchemy ORM中复制此SQL,python,mysql,sqlalchemy,gis,Python,Mysql,Sqlalchemy,Gis,我需要在SQLAlchemy中复制下面的SQL语句,我使用ORM,尽管我可以使用原始引擎来运行SQL,但是我在结果中失去了面向对象的优点 SELECT *, (6371 * acos(cos(radians(50.4)) * cos(radians(latitude)) * cos(radians(longitude) - radians(-4.15)) + sin(radians(50.4)) * sin(radians(latitude)))) distance FROM mapob

我需要在SQLAlchemy中复制下面的SQL语句,我使用ORM,尽管我可以使用原始引擎来运行SQL,但是我在结果中失去了面向对象的优点

SELECT *, 
  (6371 * acos(cos(radians(50.4)) * cos(radians(latitude)) * cos(radians(longitude) - radians(-4.15)) + sin(radians(50.4)) * sin(radians(latitude)))) distance 
FROM mapobject 
HAVING distance < 150
ORDER BY distance;
选择*,
(6371*acos(弧度(50.4))*cos(弧度(纬度))*cos(弧度(经度)-弧度(-4.15))+sin(弧度(50.4))*sin(弧度(纬度)))距离
来自mapobject
距离小于150的
按距离排序;

好的,最后我承认,直接在会话中使用引擎,并在这一查询中放弃ORM功能,这要容易得多,因此

    sql = text('SELECT *, (6371 *acos(cos( radians( %s ) ) * cos( radians( `latitude` ) ) * cos(radians( `longitude` ) - radians( %s )) + sin(radians(%s)) * sin(radians(`latitude`)))) `distance` FROM `mapobject` JOIN user ON mapobject.created_by = user.id WHERE deleted=0 HAVING `distance` < %s ORDER BY `distance`;' % (latitude, longitude, latitude, distance))
    map_objects = g.db.connection().execute(sql)
    humanised_map_objects = []
    for map_object in map_objects:
        tags = g.db.query(MapObjectTag).filter(MapObjectTag.map_object_id == map_object[0]).all()
        text_tags = []
        for tag in tags:
            text_tags.append(tag.tag)

        map_object_humanised = {'id': map_object[0],
                                'object_type': map_object[1],
                                'longitude': map_object[3],
                                'latitude': map_object[2],
                                'description': map_object[6],
                                'created_at': map_object[5].isoformat(),
                                'created_by': map_object[9],
                                'tags': text_tags}
        humanised_map_objects.append(map_object_humanised)
sql=text('SELECT*,(6371*acos(弧度(%s))*cos(弧度('latitude'))*cos(弧度('latitude')-radians(%s))+sin(弧度(%s))*sin(弧度('latitude'))`distance`FROM`mapobject`在mapobject上加入用户。由=user.id创建,其中删除的=0具有`distance`<%s ORDER by`distance`;'%(纬度、经度、纬度、距离)
map_objects=g.db.connection().execute(sql)
人性化的_贴图_对象=[]
对于map_对象中的map_对象:
tags=g.db.query(MapObjectTag).filter(MapObjectTag.map\u对象\u id==map\u对象[0])。all()
text_标记=[]
对于标记中的标记:
text_tags.append(tag.tag)
map_object_Humanized={'id':map_object[0],
“对象类型”:映射对象[1],
“经度”:映射对象[3],
“纬度”:映射对象[2],
“说明”:映射对象[6],
“created_at”:映射_对象[5]。isoformat(),
“创建人”:映射对象[9],
“标记”:文本\u标记}
人性化映射对象。附加(映射对象人性化)
但是,如果有人有更好的方法做到这一点,并且仍然有ORM的好处,请让我知道