Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 炼金术中的哈弗辛公式_Python_Sql_Sqlalchemy_Haversine - Fatal编程技术网

Python 炼金术中的哈弗辛公式

Python 炼金术中的哈弗辛公式,python,sql,sqlalchemy,haversine,Python,Sql,Sqlalchemy,Haversine,我的代码中有以下几行 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` fro

我的代码中有以下几行

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

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

您不能在WHERE子句中引用命名表达式距离,我不知道这是否适用于所有数据库系统,但至少对MySQL是这样。您可以使用have代替,请参见选项C

选项:

A.在where子句中再次重复该表达式:

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

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

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)}

此外,仅对我而言,这是否正确地用作“距离”而不是作为别名使用距离?我的意思是允许使用“?

如果我缺少某些内容,很抱歉,但计算值是如何连接到消息db表的?我是指您传递到外部的所有计算值以及计算的预期值?
SELECT id, (long_formula) as distance FROM message HAVING distance <= ...
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)}