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+"_%'")
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+"_%'")
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()
il metodo precedente non è compatibile con psycopg2 perché fetchone si aspetta un parametro (self), non due fetchone non si aspetta una query come argomento. –
Grazie per la correzione! – unutbu
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
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.
.rowcount per Select sembra essere sempre 1 –
@ 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
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. –
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
"""
+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. –
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. –
@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
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)
questo è più semplice e ha funzionato come un fascino. Grazie. – Anthony
ciò che funziona per me è print len (cursor.fetchall()) – alvaro562003
c'è una differenza di prestazioni usando len()? –
per mysql modo più semplice è questa
mycur.execute("SELECT COUNT(*) FROM osreport")
print(mycur.fetchall())
// 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]
Questa domanda non ha senso. Un'istruzione select non ha alcun effetto su ** eventuali ** righe. –
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
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