Nig*_*gel 2 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` 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()
Run Code Online (Sandbox Code Playgroud)
我使用它时出现以下错误
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' ()
Run Code Online (Sandbox Code Playgroud)
解决这个问题的正确方法是什么?
你不能distance在WHERE子句中引用命名的表达式()(我不知道这对于所有数据库系统是否通常都是正确的,但对于MySQL来说至少是这样).您可以HAVING改为使用(参见选项C).
选项:
A.在where子句中再次重复表达式:
SELECT id, (long_formula) as distance FROM message WHERE (long_formula) <= ...
Run Code Online (Sandbox Code Playgroud)
B.使用嵌套查询:
SELECT * FROM
(SELECT id, (long_formula) AS distance FROM message) inner_query
WHERE distance <= ...
Run Code Online (Sandbox Code Playgroud)
C.使用HAVING条款(我使用SQL多年,但并没有意识到HAVING,直到我读这个):
SELECT id, (long_formula) as distance FROM message HAVING distance <= ...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
964 次 |
| 最近记录: |