2010-03-24 15 views
36

Come posso accedere al numero di righe interessate da:Python: Numero di righe interessate da cursor.execute ("SELECT ...)

cursor.execute("SELECT COUNT(*) from result where server_state='2' AND name LIKE '"+digest+"_"+charset+"_%'") 
+30

Questa domanda non ha senso. Un'istruzione select non ha alcun effetto su ** eventuali ** righe. –

+4

Penso che l'intenzione è di ottenere il numero di righe restituito da 'COUNT (*)' che significa che la domanda effettiva è "Come accedere al risultato di' cursor.execute'. – lmichelbacher

+4

Inoltre mai, MAI usare concatenazioni di stringhe di python vedere http : //initd.org/psycopg/docs/usage.html#the-problem-with-the-query-parameters, o sarai nel mondo del dolore! – Alex

risposta

49

Provare a utilizzare fetchone:

cursor.execute("SELECT COUNT(*) from result where server_state='2' AND name LIKE '"+digest+"_"+charset+"_%'") 
result=cursor.fetchone() 

result terrà una tupla con un solo elemento, il valore di COUNT(*). Quindi, per trovare il numero di righe:

number_of_rows=result[0] 

O, se si preferisce farlo in un colpo solo:

cursor.execute("SELECT COUNT(*) from result where server_state='2' AND name LIKE '"+digest+"_"+charset+"_%'") 
(number_of_rows,)=cursor.fetchone() 

PS. È anche buona norma usare gli argomenti parametrizzati quando possibile, perché può automaticamente citare argomenti per te quando necessario e proteggere da SQL injection.

La sintassi corretta per gli argomenti parametrizzati dipende dall'adattatore python/database (ad esempio mysqldb, psycopg2 o sqlite3). Sarebbe qualcosa di simile

cursor.execute("SELECT COUNT(*) from result where server_state= %s AND name LIKE %s",[2,digest+"_"+charset+"_%"]) 
(number_of_rows,)=cursor.fetchone() 
+0

il metodo precedente non è compatibile con psycopg2 perché fetchone si aspetta un parametro (self), non due fetchone non si aspetta una query come argomento. –

+0

Grazie per la correzione! – unutbu

+0

La sostituzione normale delle stringhe Python per creare istruzioni non è l'approccio preferito. O come dice la documentazione ufficiale ["Never do this - insecure!"] (Https://docs.python.org/2/library/sqlite3.html). Usa invece la sintassi '' ' – lmichelbacher

82

Da PEP 249, che di solito è implementato da API di database Python:

cursore oggetti dovrebbero rispondere ai seguenti metodi e attributi:

[...]

.rowcoun t
Questo attributo di sola lettura specifica il numero di righe che l'ultimo .execute *() ha prodotto (per istruzioni DQL come 'select') o interessate (per istruzioni DML come 'update' o 'insert').

Spero che sia quello che intendevi.

+2

.rowcount per Select sembra essere sempre 1 –

+5

@ Tie-combattente: è stata prodotta una riga, contenente il valore 'COUNT (*)'. Se interrogate 'SELECT nome FROM risultato WHERE server_state = '2'', ad esempio, otterrete zero, una o più righe. – AndiDog

+10

SQLite * sempre * produce' cursor.rowcount == -1' per le istruzioni 'SELECT' come non sa quante righe verranno restituite fino a quando non avrai restituito tutte le righe; è iterator fino in fondo per SQLite. –

31

Il numero di righe effettuato viene restituito da eseguire:

rows_affected=cursor.execute("SELECT ... ") 

naturalmente, come AndiDog già accennato, è possibile ottenere il conteggio delle righe accedendo alla proprietà rowcount del cursore in qualsiasi momento per ottenere il conteggio per l'ultimo eseguire:

cursor.execute("SELECT ... ") 
rows_affected=cursor.rowcount 

Dalla documentazione in linea di python MySQLdb:

def execute(self, query, args=None): 

    """Execute a query. 

    query -- string, query to execute on server 
    args -- optional sequence or mapping, parameters to use with query. 

    Note: If args is a sequence, then %s must be used as the 
    parameter placeholder in the query. If a mapping is used, 
    %(key)s must be used as the placeholder. 

    Returns long integer rows affected, if any 

    """ 
+2

+1 Boaz, "rows_affected = cursor.rowcount" è assolutamente la migliore risposta. Non richiede una query aggiuntiva poiché il valore è sempre presente. il conteggio delle righe è utile per determinare il numero di record inseriti, aggiornati, cancellati o recuperati tramite una query. –

+11

Secondo il già citato [PEP 249] (http://www.python.org/dev/peps/pep-0249/) il valore restituito dal metodo 'cursor.execute' non è più definito (nella versione precedente di le specifiche dovevano funzionare come nell'esempio di Boaz). La specifica suggerisce esplicitamente l'uso di _the più flessibile attributo .rowcount invece_ poiché il valore restituito dal metodo 'execute' dipende dall'implementazione dell'interfaccia del database. –

+1

@Boaz - Ho trovato questo approccio NON FUNZIONA per MariaDB 10.4.17, Python 2.7.8 e Connector/Python 2.0.4. Purtroppo, non sono riuscito a trovare QUALSIASI approccio pubblicato che abbia funzionato per quella combinazione di strumenti. Alla fine ho dovuto scorrere le righe e contarle anch'io! – SMGreenfield

17

A mio parere, il modo più semplice per ottenere la quantità di righe selezionate è la seguente:

L'oggetto cursore ritorna una lista con i risultati quando si utilizzano i comandi fetch (fetchall(), fetchOne() , fetchmany()). Per ottenere le righe selezionate basta stampare la lunghezza di questo elenco. Ma ha senso solo per fetchall().;-)

Esempio:

print len(cursor.fetchall) 
+0

questo è più semplice e ha funzionato come un fascino. Grazie. – Anthony

+0

ciò che funziona per me è print len ​​(cursor.fetchall()) – alvaro562003

+0

c'è una differenza di prestazioni usando len()? –

1

per mysql modo più semplice è questa

mycur.execute("SELECT COUNT(*) FROM osreport") 
print(mycur.fetchall()) 
0

// questo funziona per me. U può usare in questo modo

query = "select count(id) from test" 
cursor.execute(query) 
var = cursor.fetchone() 
print var[0] 
Problemi correlati