python
  • mysql
  • 2010-06-03 64 views 2 likes 
    2

    我有以下查询,我正在执行使用Python脚本(通过使用MySQLdb模块)。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公式计算

    回答

    3

    AFAIK您无法使用​​运行多个语句。
    但是,您可以让MySQLdb处理值替换。

    请注意,有两个参数传递给​​。
    此外,只是运行​​实际上不会返回任何结果。
    您需要使用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 
    
    +0

    我很生气,因为犯了这样一个愚蠢的错误。谢谢您的帮助。 – GobiasKoffi 2010-06-03 03:38:58

    2

    你确定HAVING子句不应该WHERE distance < @radius呢?

    +0

    我做了修改,但它似乎没有帮助补救我的情况。你有什么建议吗? – GobiasKoffi 2010-06-03 03:27:24

    +0

    +1注意细节。 – bernie 2010-06-03 03:38:54

    +0

    啊哈,这让你超过了10K;恭喜! – bernie 2010-06-03 04:06:09

     相关问题

    • 暂无相关问题^_^