【问题标题】:Python and MySQLdbPython 和 MySQLdb
【发布时间】:2010-06-03 03:14:13
【问题描述】:

我使用 Python 脚本(通过使用 MySQLdb 模块)执行以下查询。

conn=MySQLdb.connect (host = "localhost", user = "root",passwd = "<password>",db = "test")
cursor = conn.cursor ()
preamble='set @radius=%s; set @o_lat=%s; set @o_lon=%s; '%(radius,latitude,longitude)
query='SELECT *, (6371*1000 * acos(cos(radians(@o_lat)) * cos(radians(lat)) * cos(radians(lon) - radians(@o_lon)) + sin(radians(@o_lat)) * sin(radians(lat))) as distance FROM poi_table HAVING distance < @radius ORDER BY distance ASC LIMIT 0, 50)'
complete_query=preamble+query
results=cursor.execute (complete_query)
print results

半径、纬度和经度的值并不重要,但它们是在脚本执行时定义的。困扰我的是上面代码的 sn-p 没有返回结果;本质上意味着执行查询的方式很不稳定。我执行了 SQL 查询(包括具有实际值的设置变量,它返回了正确数量的结果)。

如果我将查询修改为简单的 SELECT FROM 查询 (SELECT * FROM poi_table),它会返回结果。这是怎么回事?

编辑:括号内的封装Haversine公式计算

【问题讨论】:

    标签: python mysql


    【解决方案1】:

    AFAIK 你不能使用execute() 运行多个语句。
    但是,您可以让 MySQLdb 处理值替换。

    请注意,有两个参数被传递给execute()
    此外,仅运行 execute() 实际上不会返回任何结果。
    您需要使用fetchone()fetchmany()fetchall()

    cursor.execute('''
        SELECT *, 
            6371*1000 * acos(cos(radians(%s)) * 
            cos(radians(lat)) * cos(radians(lon) - radians(%s)) + 
            sin(radians(%s)) * sin(radians(lat))) as distance 
        FROM 
            poi_table 
        WHERE distance < %s
        ORDER BY distance ASC 
        LIMIT 0, 50''', (latitude, longitude, latitude, radius,))
    results = cursor.fetchall()
    print results
    

    【讨论】:

    • 我对自己犯了这么愚蠢的错误感到非常生气。感谢您的帮助。
    【解决方案2】:

    您确定 HAVING 子句不应该是 WHERE distance &lt; @radius 吗?

    【讨论】:

    • 我进行了更改,但似乎并没有帮助解决我的情况。您还有什么建议吗?
    • 啊哈,这让你超过了 10k;恭喜!
    猜你喜欢
    • 2015-01-20
    • 2011-11-10
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    • 2016-09-19
    • 2013-12-26
    • 2013-01-30
    • 2011-09-30
    相关资源
    最近更新 更多