python
  • mysql
  • 2010-06-03 65 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

     相關問題

    • 暫無相關問題^_^