Формула Хаверсине в sqlalchemy - PullRequest
2 голосов
/ 10 июня 2011

У меня есть следующие строки в моем коде

    query = "SELECT id, " \
        "( 3959 * acos( cos( radians(37) ) * cos( radians( %(lat)i ) ) * " \
        "cos( radians( %(lng)i ) - radians(-122) ) + sin( radians(37) ) * " \
        "sin( radians( %(lat)i ) ) ) ) AS `distance` from message where" \
        " `distance` <= %(drange)d" % {'lat': float(lat), 'lng': float(lng), 'drange': int(drange)}
    print query
    messages = db.session.query(Message).from_statement(query).all()

При использовании этого

OperationalError: (OperationalError) (1054, "Unknown column 'distance' in 'where clause'") 'SELECT id, ( 3959 * acos( cos( radians(37) ) * cos( radians( 0 ) ) * cos( radians( 0 ) - radians(-122) ) + sin( radians(37) ) * sin( radians( 0 ) ) ) ) AS `distance` from message where `distance` <= 50' ()

я получаю следующую ошибку * Как правильно это исправить?

Ответы [ 2 ]

5 голосов
/ 10 июня 2011

Вы не можете ссылаться на именованное выражение (distance) в предложении WHERE (я не знаю, верно ли это вообще для всех систем баз данных, но это по крайней мере так для MySQL).Вместо этого вы можете использовать HAVING (см. Опцию C).

Опции:

A.Повторите выражение еще раз в предложении where:

SELECT id, (long_formula) as distance FROM message WHERE (long_formula) <= ...

B.Используйте вложенный запрос:

SELECT * FROM 
(SELECT id, (long_formula) AS distance FROM message) inner_query 
WHERE distance <= ...

C.Используйте предложение HAVING (я использовал SQL годами, но не знал о HAVING, пока не прочитал this ):

SELECT id, (long_formula) as distance FROM message HAVING distance <= ...
0 голосов
/ 10 июня 2011

Не относится к вашему вопросу, но вы можете повысить удобочитаемость вашего запроса, если начнете использовать "" ". Например, ваш запрос может быть изменен следующим образом:

query = """
            SELECT id,
            ( 3959 * acos( cos( radians(37) ) * cos( radians( %(lat)i ) ) *  cos( radians( %(lng)i ) - radians(-122) ) +
              sin( radians(37) ) * sin( radians( %(lat)i ) ) ) ) AS distance
            FROM message
            WHERE distance <= %(drange)d
         """ % {'lat': float(lat), 'lng': float(lng), 'drange': int(drange)}

Также только для меня это правильноиспользовать "AS" расстояние "вместо" AS расстояние "в качестве псевдонима. Я имею в виду, разрешено ли использовать" '"?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...