【问题标题】:Haversine's formula in sqlalchemysqlalchemy 中的 Haversine 公式
【发布时间】:2011-09-12 01:25:00
【问题描述】:

我的代码中有以下几行

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

解决这个问题的正确方法是什么?

【问题讨论】:

  • 对不起,如果我遗漏了一些东西,但是计算值如何连接到消息数据库表(我的意思是您传递给外部的所有计算值以及计算的预期值?

标签: python sql sqlalchemy haversine


【解决方案1】:

您不能在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 多年,但直到我读到this 才知道HAVING):

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

【讨论】:

    【解决方案2】:

    与您的问题无关,但如果开始使用“””,您可以提高查询的可读性 例如,您的查询可以通过以下方式修改:

    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 距离”作为别名是否正确,我的意思是允许使用“'”?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-22
      • 1970-01-01
      • 1970-01-01
      • 2015-02-26
      • 2012-06-10
      • 1970-01-01
      • 2013-01-11
      • 2010-11-05
      相关资源
      最近更新 更多