2009-05-08 10 views
18

que estoy tratando de conseguir el rowcount de un sqlite3cursor en mi programa Python3k, pero estoy desconcertado, como el rowcount es siempre -1, a pesar de lo que dicen los documentos python3 (en realidad es contradictorio, debe ser None). Incluso después de obtener todas las filas, rowcount se queda en -1. ¿Es un error sqlite3? Ya he comprobado si hay filas en la tabla.cursor.rowcount siempre -1 en sqlite3 en python3k

Puedo evitar esta comprobación si un fetchone() devuelve algo diferente a None, pero pensé que sería un buen tema para discutir.

Gracias.

+0

"en realidad es contradictorio ..." Proporciona una referencia o un enlace para esto. –

+0

http://docs.python.org/3.0/library/sqlite3.html?highlight=sqlite#sqlite3.Cursor Quizás me equivoqué, pero el último párrafo de Cursor.rowcount dice "Esto incluye instrucciones SELECT porque no podemos determine el número de filas que una consulta produjo hasta que se hayan obtenido todas las filas ". Así que supuse que después de obtenerlos, fetchone() o fetchall() obtendría un recuento de filas actualizado. gracias – Hiperi0n

+0

Al usar el paquete 'mysql.connector' el atributo rowcount es -1 después de una llamada .execute de una declaración SELECT, pero después de que el llamado fetchall() llame al número real de filas en los datos' fetch'ed es devuelto. Solo una observación ... – Duffau

Respuesta

16

Desde el documentation:

Como requerido por el Python DB API Spec, el atributo recuento de filas “es -1 en caso no executeXX() se ha realizado en el cursor o el recuento de filas de la la última operación de no se puede determinar mediante la interfaz ".

Esto incluye SELECT declaraciones porque no podemos determinar el número de filas una consulta produce hasta que todas las filas eran descabellada.

Eso significa todosSELECT declaraciones no tendrá un rowcount. El comportamiento que estás observando está documentado.

EDIT: La documentación no dice en ninguna parte que se rowcount se actualizará después de hacer un fetchall() lo que es sólo un error suponer que.

8

En lugar de "comprobar si un fetchone() devuelve algo diferente de None", sugiero:

cursor.execute('SELECT * FROM foobar') 
for row in cursor: 
    ... 

esto es sqlite -sólo (no soportado en otras implementaciones de la API de base de datos), pero muy práctico para sqlite - código específico de Python (y completamente documentado, vea http://docs.python.org/library/sqlite3.html).

9
cursor = newdb.execute('select * from mydb;') 
print len(cursor.fetchall()) 

El fetchall() devolverá una lista de las filas devueltas de la selección. Len de esa lista te dará el conteo de filas.

+1

La principal advertencia de esto es que, si se produce un cambio que indica que esta llamada devolvería una cantidad excesiva de filas, podría terminar con problemas de memoria. (Esta es la razón por la cual execute devuelve un cursor [iterador de Python] en lugar de devolver una lista o matriz explícita). (Aunque en mi caso particular, esto no era una preocupación.) – Brad

7

Puede mejor contar las filas de esta manera:

print cur.execute("SELECT COUNT(*) FROM table_name").fetchone()[0] 
-2

Usando PyCharm, en modo de depuración, si se pone el cursor en la variable de cursor, aparecerá un pequeño +, cuando se hace clic en él, se ve diferentes propiedades de tu objeto

En mi cursor de 1 elemento, que veo:

rowcount={int} 
arraysize={int}1 

Por lo tanto, en el código, sólo tiene que utilizar:

print(cursor.arraysize) 
1 
+0

El arraysize de Cursor controla cuántas filas son devueltas por 'fetchmany()', y es 1 por defecto. No tiene nada que ver con el recuento de filas –