【问题标题】:MySQLdb.cursors.Cursor.execute returns different values in case of different cursors why?MySQLdb.cursors.Cursor.execute 在不同游标的情况下返回不同的值为什么?
【发布时间】:2013-01-11 03:22:34
【问题描述】:

看这两个python代码sn-ps,

conn = MySQLdb.connect(c['host'], c['user'], c['password'], c['db'])
cur = conn.cursor()
cur.execute("select * from geo_weathers;)   ->  **1147L**

conn = MySQLdb.connect(c['host'], c['user'], c['password'], c['db'], cursorclass=MySQLdb.cursors.SSCursor)
cur = conn.cursor()
cur.execute("select * from geo_weathers")   ->  **18446744073709551615L**

为什么以上两种情况返回的行数不同? 仅供参考,一个表中有 1147 行。

SSCursor 用于在服务器端保存结果。是这个原因吗? 此选择查询会影响哪些所有行?

有人知道吗?

【问题讨论】:

    标签: python cursor mysql-python


    【解决方案1】:

    MySQLdb 使用的标准游标是存储结果游标。这意味着作为execute() 调用的结果,整个结果集从服务器传输并缓存在客户端的内存中。

    SSCursor 是服务器端游标,只会在请求时将结果返回给客户端。

    游标execute() 调用将返回MySql C API 函数mysql_affected_rows() 的结果,该函数又返回mysql_num_rows()SELECT 查询的结果。

    由于结果存储在服务器端,客户端在迭代结果之前不知道有多少行受到影响。

    mysql_num_rows() 的文档是这样说的:

    mysql_num_rows()的使用取决于你是否使用 mysql_store_result() 或 mysql_use_result() 返回结果集。 如果使用 mysql_store_result(),可能会调用 mysql_num_rows() 立即地。如果使用 mysql_use_result(),mysql_num_rows() 不会 返回正确的值,直到结果集中的所有行都有 已取回。

    如果要获取行数,请使用SELECT COUNT(*) from geo_weathers 而不是依赖execute() 调用的结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-13
      • 2011-03-27
      • 2014-02-10
      • 1970-01-01
      • 1970-01-01
      • 2013-05-09
      • 2015-11-27
      相关资源
      最近更新 更多