Python连接MySQL查询无结果,cursor.rowcount返回-1求助
解决mysql.connector执行SELECT后cursor.rowcount返回-1的问题
问题原因
mysql.connector默认使用非缓冲游标,这种游标不会在执行execute()后一次性把所有查询结果加载到本地内存,而是需要主动调用fetchone()、fetchall()等方法获取数据,因此游标无法提前知晓结果集的总条数,rowcount就会返回-1。而你直接在数据库客户端执行SQL时,客户端会自动加载所有结果,所以能看到完整的67条数据。
解决方案
根据需求选择以下可行方案:
1. 使用缓冲游标
创建游标时指定buffered=True,或者直接调用MySQLBufferedCursor,让游标提前把所有查询结果加载到内存,rowcount就能正确返回结果总数:
def main(): cnx = db_connect() # 启用缓冲游标 cursor = cnx.cursor(buffered=True) query = ("SELECT lower(UserName) from Participants ;") cursor.execute(query) print(cursor.rowcount) # 此时会输出67
2. 手动获取结果后统计数量
如果不需要依赖rowcount,可以直接获取所有结果后用len()统计条数,同样能拿到准确数量:
def main(): cnx = db_connect() cursor = cnx.cursor() query = ("SELECT lower(UserName) from Participants ;") cursor.execute(query) all_results = cursor.fetchall() print(len(all_results)) # 输出67
3. 直接查询总数(仅需数量时)
如果你的需求只是获取记录条数,不需要实际的UserName数据,直接执行COUNT(*)查询效率更高:
def main(): cnx = db_connect() cursor = cnx.cursor() query = ("SELECT COUNT(*) FROM Participants ;") cursor.execute(query) count = cursor.fetchone()[0] print(count) # 输出67
注意事项
- 缓冲游标会把所有结果加载到内存,如果查询结果集非常大,可能占用较多内存,这种情况下更推荐用
fetchall()统计或分批处理数据。 - 你已经确认数据库连接无错误,因此无需额外排查连接配置问题。
内容的提问来源于stack exchange,提问作者Rick Dearman
相关产品推荐
相关产品推荐

