See these two python code snippets,
conn = MySQLdb.connect(c['host'], c['user'], c['password'], c['db'])
cur = conn.cursor()
cur.execute("select * from geo_weathers;) -> **1147L**
and
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**
Why the returned number of rows are different in above two cases ? And just FYI there are 1147 rows in a table.
SSCursor is used for saving result at servers side. Is it the reason ? What all rows are affected by this select query ?
Does anyone know ?
The standard cursor used by MySQLdb is a stored result cursor. This means that the entire result set is transferred from the server and cached in the client's memory as a result of the
execute()
call.A
SSCursor
is a server side cursor will only return results to the client as they are requested.The cursor
execute()
call will return the result of the MySql C API function mysql_affected_rows() which in turn returns the result of mysql_num_rows() forSELECT
queries.Because results are stored server side, the client does not know how many rows have been affected until it iterates over the results.
The documentation for
mysql_num_rows()
says this:If you want to obtain a count of the number of rows, use
SELECT COUNT(*) from geo_weathers
rather than rely on the result of theexecute()
call.