У меня есть следующий запрос, который я выполняю с помощью скрипта 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), он вернет результаты. Что здесь происходит?

РЕДАКТИРОВАТЬ: вычисление инкапсулированной формулы гаверсинуса в скобках

3
GobiasKoffi 3 Июн 2010 в 07:14

2 ответа

Лучший ответ

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
3
mechanical_meat 3 Июн 2010 в 03:29

Вы уверены, что предложение HAVING не должно быть вместо WHERE distance < @radius?

2
Ben Hoffstein 3 Июн 2010 в 03:24