首页 > 解决方案 > 如何在 SQLAlchemy ORM 中复制此 SQL

问题描述

我需要在 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;

标签: pythonmysqlsqlalchemygis

解决方案


好吧,最后我承认,直接在会话内部使用引擎要容易得多,并且在这个查询中失去了 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)

但是,如果有人有更好的方法来做到这一点并且仍然有 ORM 的优点,请告诉我。


推荐阅读