【发布时间】:2021-05-28 14:52:05
【问题描述】:
我正在尝试计算数据库中(经度/纬度)中两点之间的最小距离。
我可以在 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,)
当然结果也是错误的。
我该如何解决这个问题?
【问题讨论】:
-
您使用哪个数据库?
latitude和longitude列的数据类型是什么? -
我正在使用 SQLite。经度、纬度是 VARCHARs (Column(String, nullable=False))
-
||是字符串连接,它源于您选择的列类型。虽然 SQLite 很乐意将它们转换为用于算术的数字,但并非所有 DBMS 都这样做。显式转换它们以获得正确的表达式。 -
是的!就是这样! @IljaEverilä。我将它转换为这样的数字:
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),它成功了。谢谢!
标签: python sql sqlalchemy