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