Python和MySQLdb

时间:2010-06-03 03:14:13

标签: python mysql

我有以下查询,我正在使用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查询(包括带有实际值的set变量,并返回了正确的结果数)。

如果我将查询修改为一个简单的SELECT FROM查询(SELECT * FROM poi_table),它将返回结果。这是怎么回事?

编辑:在括号内计算封装的Haversine公式

2 个答案:

答案 0 :(得分:3)

AFAIK您无法使用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

答案 1 :(得分:2)

您确定HAVING子句不应该是WHERE distance < @radius吗?