You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 02:00:38