我正在使用SQlite和Python构建我的第一个烧瓶应用程序。
我使用下面提到的方法使用索引RTree将从Arduino接收到的GPS坐标存储到SQlite数据库中 http://janmatuschek.de/LatitudeLongitudeBoundingCoordinates#UsingIndex
Sqlite虚拟表如下所示:
Node_ID |纬度|经度
以下查询正在尝试获取带有给定raduis(KM)的Node_ids。
此处的列名称:LATITUDE和LONGITUDE。
变量是:lat,lng,boundary(包含lat_min,lat_max,lg_min)和raduis。
"""
SELECT * FROM Userdata WHERE (LATITUDE >={lt_min} AND LATITUDE <= {lt_max}) AND (LONGITUDE >= {lg_min} AND LONGITUDE <= {lg_min})
AND acos(sin({lt}) * sin(LATITUDE) + cos({lt}) * cos(LATITUDE) * cos(LONGITUDE-(-{lg}))) <={dist}
""".format(lt=lat,lt_min=boundaries[0],lt_max=boundaries[1],
lg=lng,lg_min=boundaries[2],lg_max=boundaries[3],
dist=radius)
虽然我有足够的坐标存储在带有1KM raduis的DB中,但当我执行SELECT语句时,我总是将匹配的行数计为“0”。 但该程序不会引发任何错误。
我在SELECT语句参数化方面找不到多少。
我使用SELECT语句的方式是否错误? 如何在SQlite中使用prepareStatement?
答案 0 :(得分:1)
首先检查documentation。
以下是一个例子:
cursor.execute(
"""
SELECT * FROM Userdata WHERE (LATITUDE >= ? AND LATITUDE <= ?)
AND (LONGITUDE >= ? AND LONGITUDE <= ?)
AND acos(sin(?) * sin(LATITUDE) + cos(?) * cos(LATITUDE) *
cos(LONGITUDE-(-?))) <=?
""", (lat,boundaries[0],boundaries[1],
lng,boundaries[2],boundaries[3], radius))