Cómo obtener el número de filas de datos de la tabla sqlite en python

Estoy tratando de obtener el número de filas devueltas desde una base de datos sqlite3 en python, pero parece que la función no está disponible:

Piense en php mysqli_num_rows() en mysql

Aunque ideé un medio, pero es un poco incómodo: suponiendo que una clase ejecute sql y déme los resultados:

 # Query Execution returning a result data = sql.sqlExec("select * from user") # run another query for number of row checking, not very good workaround dataCopy = sql.sqlExec("select * from user") # Try to cast dataCopy to list and get the length, I did this because i notice as soon # as I perform any action of the data, data becomes null # This is not too good as someone else can perform another transaction on the database # In the nick of time if len(list(dataCopy)) : for m in data : print("Name = {}, Password = {}".format(m["username"], m["password"])); else : print("Query return nothing") 

¿Existe una función o propiedad que puede hacer esto sin estrés?

Normalmente , cursor.rowcount le dará el número de resultados de una consulta.

Sin embargo, para SQLite, esa propiedad a menudo se establece en -1 debido a la naturaleza de cómo SQLite produce resultados. A falta de una consulta COUNT() primero, a menudo no sabrá el número de resultados devueltos.

Esto se debe a que SQLite produce filas a medida que las encuentra en la base de datos, y no sabrá cuántas filas se producirán hasta que se llegue al final de la base de datos.

De la documentación de cursor.rowcount :

Aunque la clase Cursor del módulo sqlite3 implementa este atributo, el soporte propio del motor de base de datos para la determinación de “filas afectadas” / “filas seleccionadas” es peculiar.

Para executemany() , el número de modificaciones se resume en el executemany() .

Como lo requiere la especificación de la API de la base de datos de Python, el atributo de executeXX() “es -1 en caso de que no se haya realizado executeXX() en el cursor o la cuenta no puede determinar el executeXX() de la última operación”. Esto incluye SELECT porque no podemos determinar el número de filas que produjo una consulta hasta que se buscaron todas las filas.

Énfasis mío.

Para su consulta específica, puede agregar una selección secundaria para agregar una columna:

 data = sql.sqlExec("select (select count() from user) as count, * from user") 

Sin embargo, esto no es tan eficiente para tablas grandes.

Si todo lo que necesita es una fila, use cursor.fetchone() lugar:

 cursor.execute('SELECT * FROM user WHERE userid=?', (userid,)) row = cursor.fetchone() if row is None: raise ValueError('No such user found') result = "Name = {}, Password = {}".format(row["username"], row["password"]) 

Use lo siguiente:

 dataCopy = sql.sqlExec("select count(*) from user") values = dataCopy.fetchone() print values[0] 

He encontrado que la instrucción select con count () es lenta en una base de datos muy grande. Además, el uso de fetch all() puede requerir mucha memoria.

A menos que diseñe explícitamente su base de datos para que no tenga un rowid, siempre puede intentar una solución rápida

 cur.execute("SELECT max(rowid) from Table") n = cur.fetchone()[0] 

Esto le dirá cuántas filas tiene su base de datos.

 import sqlite3 conn = sqlite3.connect(path/to/db) cursor = conn.cursor() cursor.execute("select * from user") results = cursor.fetchall() print len(results) 

len (resultados) es justo lo que quieres

Un enfoque alternativo simple aquí es usar fetchall para arrastrar una columna a una lista de python, luego contar la longitud de la lista. No sé si esto es pythonico o especialmente eficiente, pero parece funcionar:

 rowlist = [] c.execute("SELECT {rowid} from {whichTable}".\ format (rowid = "rowid", whichTable = whichTable)) rowlist = c.fetchall () rowlistcount = len(rowlist) print (rowlistcount) 

este código funcionó para mí:

 import sqlite3 con = sqlite3.connect(your_db_file) cursor = con.cursor() result = cursor.execute("select count(*) from your_table") #returns array of tupples num_of_rows = result[0][0]