Python 和 MySQLdb

3

我正在使用Python脚本(使用MySQLdb模块)执行以下查询。

conn=MySQLdb.connect (host = "localhost", user = "root",passwd = "<password>",db = "test")
cursor = conn.cursor ()
preamble='set @radius=%s; set @o_lat=%s; set @o_lon=%s; '%(radius,latitude,longitude)
query='SELECT *, (6371*1000 * acos(cos(radians(@o_lat)) * cos(radians(lat)) * cos(radians(lon) - radians(@o_lon)) + sin(radians(@o_lat)) * sin(radians(lat))) as distance FROM poi_table HAVING distance < @radius ORDER BY distance ASC LIMIT 0, 50)'
complete_query=preamble+query
results=cursor.execute (complete_query)
print results

半径、纬度和经度的值并不重要,但在脚本执行时它们被定义。让我困扰的是上面的代码片段没有返回结果,这意味着查询的执行方式有问题。我执行了SQL查询(包括实际值的设置变量),并返回了正确数量的结果。
如果我修改查询为一个简单的SELECT FROM查询(SELECT * FROM poi_table),它会返回结果。这里发生了什么?
编辑:将Haversine公式计算封装在括号内。
2个回答

3
据我所知,您无法使用execute()运行多个语句。
但是,您可以让MySQLdb处理值的替换。

请注意,有两个参数传递给execute()
此外,仅运行execute()实际上并不返回任何结果。
您需要使用fetchone()fetchmany()fetchall()

cursor.execute('''
    SELECT *, 
        6371*1000 * acos(cos(radians(%s)) * 
        cos(radians(lat)) * cos(radians(lon) - radians(%s)) + 
        sin(radians(%s)) * sin(radians(lat))) as distance 
    FROM 
        poi_table 
    WHERE distance < %s
    ORDER BY distance ASC 
    LIMIT 0, 50''', (latitude, longitude, latitude, radius,))
results = cursor.fetchall()
print results

我为自己犯了如此愚蠢的错误感到非常生气。谢谢你的帮助。 - GobiasKoffi

2
你确定HAVING子句不应该改为WHERE distance < @radius吗?

我已经做出了更改,但似乎并没有帮助解决我的问题。你还有什么建议吗? - GobiasKoffi
啊哈,这让你超过了10k;恭喜! - mechanical_meat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接