Solución:
rowcount
se refiere al número de filas afectadas por la última operación. Entonces, si haces un insert
e inserte solo una fila, devolverá 1. Si actualiza 200 filas, devolverá 200. Por otro lado, si SELECT
, la última operación no afecta realmente filas, es un conjunto de resultados. En ese caso, 0
sería sintácticamente incorrecto, por lo que la interfaz devuelve -1
en lugar de.
También volverá -1
para operaciones en las que hace cosas como establecer variables o usar comandos de creación / modificación.
Te estás conectando a una base de datos que no puede darte ese número para tu consulta. Muchos motores de base de datos producen filas a medida que obtiene resultados, escaneando su tabla interna y estructuras de datos de índice para el siguiente resultado coincidente a medida que lo hace. El motor no puede conocer el recuento final hasta que haya obtenido todas las filas.
Cuando no se conoce el recuento de filas, la especificación Python DB-API 2.0 para Cursor.rowcount
indica que el número debe establecerse en -1
en ese caso:
El atributo es
-1
en caso […] la interfaz no puede determinar el recuento de filas de la última operación.
El pyodbc Cursor.rowcount
la documentación cumple con este requisito:
El número de filas modificadas por la última instrucción SQL.
Este es -1 si no se ha ejecutado SQL o si se desconoce el número de filas. Tenga en cuenta que no es raro que las bases de datos informen -1 inmediatamente después de una instrucción de selección de SQL por razones de rendimiento. (Es posible que no se conozca el número exacto antes de que se devuelvan los primeros registros a la aplicación).
pyodbc no está solo en esto, otro ejemplo fácil de vincular es la biblioteca estándar de Python sqlite3
módulo; es Cursor.rowcount
estados de documentación:
Como lo requiere la especificación de la API de base de datos de Python, el atributo de recuento de filas “es -1 en caso de que no
executeXX()
se ha realizado en el cursor o el recuento de filas de la última operación no es determinable por la interfaz ”. Esto incluyeSELECT
declaraciones porque no podemos determinar el número de filas que produce una consulta hasta que se recuperan todas las filas.
Tenga en cuenta que para el subconjunto de implementaciones de base de datos, el valor del recuento de filas se puede actualizar después de obtener algunos de las filas. Deberá verificar la documentación de su base de datos específica a la que se está conectando para ver si las implementaciones pueden hacer esto, o si el recuento de filas debe permanecer en -1. Siempre puedes experimentar, por supuesto.
Podrías ejecutar un COUNT()
seleccione primero, o, si no se espera que el conjunto de resultados sea demasiado grande, utilice cursor.fetchall()
y use len()
en la lista resultante.
Si está utilizando microsoft sql server y desea obtener el número de filas devueltas en la declaración de selección anterior, puede simplemente ejecutar select @@rowcount
.
P.ej:
cursor.execute("select @@rowcount")
rowcount = cursor.fetchall()[0][0]