SQLAlchemy中的Haversine公式

3
我在我的代码中有以下几行:

我在我的代码中有以下几行

    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' ()

什么是正确的修复方法?

抱歉如果我漏掉了什么,但是计算值如何与消息数据库表连接(我的意思是你传递的所有计算值以及预期的计算值在外部? - Artsiom Rudzenka
2个回答

5

您不能在 WHERE 子句中引用命名表达式(distance),至少在 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):

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

0

与你的问题无关,但是如果开始使用 """,你可以提高查询的可读性。 例如,你的查询可以按以下方式进行修改:

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 'distance'而不是' AS distance'对我来说是正确的。我的意思是,使用' '是否允许?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接