Come ottenere i numeri di riga di dati da database sqlite3 in python

Sto cercando di ottenere il numero di righe restituite da un database sqlite3 in python, ma sembra che la funzione non è disponibile:

Pensare php mysqli_num_rows() in mysql

Anche se ho pensato ad un mezzo, ma è un imbarazzante: assumere una classe di eseguire sql e mi danno i risultati:

# 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")

C’è una funzione o una proprietà che può fare questo senza stress.

OriginaleL’autore Temitayo | 2014-02-17

6 Replies
  1. 5

    Normalmente, cursore.rowcount vuoi dare il numero di risultati di una query.

    Tuttavia, per SQLite, che la proprietà è spesso impostato a -1 a causa della natura di come SQLite produce risultati. A corto di una COUNT() query primo spesso non si conosce il numero di risultati restituiti.

    Questo perché SQLite produce righe non li trova nel database, e non stesso sapere quante righe sono prodotte fino alla fine del database.

    Dalla documentazione di cursor.rowcount:

    Anche se il Cursor classe di sqlite3 modulo implementa questo attributo, il motore di database di supporto per la determinazione delle “righe interessate”/”righe selezionate” è “bizzarro”.

    Per executemany() dichiarazioni, il numero di modifiche sono riassunte in rowcount.

    Come richiesto dal Python DB API Spec rowcount attributo “è -1 nel caso in cui non executeXX() è stato eseguito il cursore o il conteggio delle righe dell’ultima operazione non è determinabile dall’interfaccia”. Questo include SELECT dichiarazioni perché non si può determinare il numero di righe di una query prodotto fino a quando tutte le righe sono stati recuperati.

    Sottolineatura mia.

    Per il vostro specifico query, è possibile aggiungere un sub-selezionare questa opzione per aggiungere una colonna:

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

    Questo non è efficiente per tabelle di grandi dimensioni, tuttavia.

    Se è uno riga, utilizzare cursor.fetchone() invece:

    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"])
    non ha funzionato restituito -1
    data.rowcount restituito -1
    data.COUNT() restituito AttributeError: 'sqlite3.Cursor' object has no attribute 'COUNT'
    è una funzione SQL, non una funzione sul cursore.
    "select (select count() from user) as count, * from user" utilizzando questa query quasi risolvere il problema, anche se ci sono ancora alcune cose che ho bisogno di capire, cerco di tirare fuori il prima fila e tirare fuori il conte senza iterazione su dati data[0]["count"] restituisce TypeError: 'sqlite3.Cursor' object is not subscriptable

    OriginaleL’autore Martijn Pieters

  2. 5

    Utilizza i seguenti:

    dataCopy = sql.sqlExec("select count(*) from user")
    values = dataCopy.fetchone()
    print values[0]
    Buona, ma voglio determinare il numero di riga, prima di fare qualcosa, e che cosa che cosa succede se non quello di fetchall?
    Ok aggiorno.

    OriginaleL’autore user3273866

  3. 3

    Ho trovato l’istruzione select con count() per essere lento su DB. Inoltre, utilizzando fetch all() può essere molto intensivo della memoria.

    Meno che non si faccia la progettazione del database in modo che non hanno un rowid, si può sempre cercare una soluzione rapida

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

    Questo vi dirà quante righe del database.

    OriginaleL’autore alexs

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

    len(risultati) è solo ciò che si desidera

    hai bisogno di aggiungere tag alle domande, per ottenere visualizzatore
    Per una tabella di grandi dimensioni, questo è estremamente inefficiente.

    OriginaleL’autore WeizhongTu

  5. 1

    Un semplice approccio alternativo qui è quello di utilizzare fetchall tirare una colonna in una lista python, poi conta la lunghezza della lista. Non so se questo è divinatori o particolarmente efficiente, ma sembra funzionare:

    rowlist = []
    c.execute("SELECT {rowid} from {whichTable}".\
              format (rowid = "rowid", whichTable = whichTable))
    rowlist = c.fetchall ()
    rowlistcount = len(rowlist)
    print (rowlistcount)
    Per una tabella di grandi dimensioni, questo è estremamente inefficiente

    OriginaleL’autore user3510563

  6. 0

    questo codice ha funzionato per me:

    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]

    OriginaleL’autore Nir

Lascia un commento