python - 如何使用括号进行算术运算
问题描述
我正在尝试计算数据库中(经度/纬度)中两点之间的最小距离。
在 SQLite 中,我可以编写(示例):
SELECT POWER(latitude-40,2) + POWER(longitude-32,2) * 0.5
FROM example_table
(0.5 是一个校正因子,以获得更好的近似值)
当我尝试在 SQLAlchemy 中做同样的事情时:
db.query((models.example_table.latitude - 40) * (models.example_table.latitude - 40) + (models.example_table.longitude - 32) * (models.example_table.longitude - 32) * 0.5).first()
那么生成的 SQL 是错误的,因为它使用了 '||' 而不是“+”:
INFO:sqlalchemy.engine.Engine:SELECT (example_table.latitude - ?) * (example_table.latitude - ?) || (example_table.longitude - ?) * (example_table.longitude - ?) * ? AS anon_1
FROM example_table
LIMIT ? OFFSET ?
INFO:sqlalchemy.engine.Engine:[generated in 0.00078s] (43, 43, 32, 32, 0.5, 1, 0)
(-56.749055346000006,)
当然结果也是错误的。
我怎样才能解决这个问题?
解决方案
括号似乎是开箱即用的。
在我的情况下,问题在于 2 个参数(经度、纬度)被建模为字符串(VARCHAR)。然后,DBMS 试图连接字符串而不是数字。
解决方案是将列转换为如下数字:
from sqlalchemy import cast, Numeric
db.query(
(cast(models.example_table.latitude, Numeric(10, 8)) - 43) *
(cast(models.example_table.latitude, Numeric(10, 8)) - 43) +
(cast(models.example_table.longitude, Numeric(10, 8)) - 32) *
(cast(models.example_table.longitude, Numeric(10, 8)) - 32) *
.5)
非常感谢评论里的人。
推荐阅读
- linux - 树莓派 Autostart.desktop 终端
- symfony - DQL 查询多对多 IN
- security - 如何限制项目管理员仅创建新存储库,azure devops 中的主分支
- c# - 具有相同属性存储库模式的多个实体
- jquery - 类中的文本应检查另一个类中的文本,如果匹配,则更改第一个文本的 css 样式
- python - 如何操作字符串中间的文本?
- ieee-754 - 为什么在双精度(IEEE 标准)中,49 是 k * (1 / k) 不完全为 1 的第一个正整数?
- javascript - 如何在本机反应中添加图像作为图标?
- javascript - JS打印函数,为什么返回false?
- javascript - Google Maps API:同一地图上的多个方向/路线