MySQLdb.cursors.Cursor.execute在不同游标的情况下返回不同的值为什么?

时间:2013-01-27 19:02:38

标签: python cursor mysql-python

请参阅这两个python代码片段,

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用于在服务器端保存结果。是原因吗? 此选择查询会影响所有行的内容吗?

有人知道吗?

1 个答案:

答案 0 :(得分:3)

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

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

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

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

SELECT COUNT(*) from geo_weathers的文档说明了这一点:

  

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

如果您想获得行数,请使用execute()而不是依赖{{1}}来电的结果。