oracledb中cursor.rowcount与实际返回行数不符,cx_Oracle无此问题
问题原因与解决方法
原因分析
oracledb 1.2.2中cursor.rowcount的统计逻辑和cx_Oracle存在差异:当调用fetchall()或fetchmany()时,rowcount会基于游标的arraysize做向上取整到倍数的统计,而非严格计数实际返回的行数。
比如你遇到的93行数据场景,若arraysize设为32(93÷32=2余29,向上取整为3块),rowcount就会显示3×32=96,完全符合你总结的规律。这是因为oracledb内部按arraysize的块来统计已处理结果,哪怕最后一块数据不足arraysize,也会按完整块的大小计数,导致数值偏差。而cx_Oracle则是直接统计实际返回的行数,所以没有这个问题。设置prefetchrows=0无效,是因为这个参数控制的是预取行数,不影响rowcount的统计逻辑。
解决方法
- 手动统计实际行数:获取结果后直接用
len()计算,这是最可靠的方式:rows = cursor.fetchall() actual_row_count = len(rows) - 调整arraysize为总行数的约数:如果提前知道结果总行数,将
cursor.arraysize设为能整除总行数的值,比如93行就设为31或93,这样rowcount会和实际行数一致。但这种方法依赖提前知晓行数,适用性有限。 - 使用
getarrayrows()替代fetch方法:这个方法会返回实际获取的行数作为第二个返回值:rows, actual_count = cursor.getarrayrows() - 升级oracledb版本:后续发布的oracledb版本(比如2.x系列)已修复该rowcount统计问题,升级到最新稳定版即可解决。
内容的提问来源于stack exchange,提问作者agrvz
相关产品推荐
相关产品推荐

