2

看到这两个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 用于在服务器端保存结果。是这个原因吗?此选择查询会影响哪些所有行?

有人知道吗 ?

4

1 回答 1

3

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

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

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

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

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

mysql_num_rows() 的使用取决于你是使用mysql_store_result() 还是my​​sql_use_result() 返回结果集。如果你使用 mysql_store_result(),mysql_num_rows() 可能会被立即调用。如果您使用 mysql_use_result(),则 mysql_num_rows() 在检索到结果集中的所有行之前不会返回正确的值。

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

于 2013-01-29T00:48:07.317 回答