python - 如何在 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;
解决方案
好吧,最后我承认,直接在会话内部使用引擎要容易得多,并且在这个查询中失去了 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 的优点,请告诉我。
推荐阅读
- go - Gopls 仅在我在 Macos Big Sur 中使用 sudo 执行 vim 或 vscode 时才有效
- c++ - 检查平衡括号代码的行为不符合预期
- python - 使用 pip 命令时出错,但 conda 命令正在安装软件包,所有可能的升级都已完成
- azure - 由于错误 MSB3191,Azure 应用服务构建失败:无法创建目录
- django - Django通过外键注释
- linux - 向 docker-compose 添加卷是否会重新创建容器并删除定义更改的容器中的数据?
- git - git:同一用户多个客户端主机,无法正常工作
- java - 如何有效地在firebase recyclerview中加载大量数据
- java - 使用 RestTemplate 反序列化 JSON 数组
- html - CSS中具有相对位置的文本重叠图像?