Per ottenere il numero di record restituiti dalla SSDictCursor
o SSCursor
, le uniche opzioni sono:
Fetch l'intero risultato e contare utilizzando len()
, che sconfigge lo scopo di utilizzare SSDictCursor
o SSCursor
nel primo posto;
Contare le righe da soli mentre si scorre su di esse, il che significa che non si conoscerà il conteggio fino alla fine (non è probabile che sia pratico); oppure,
Eseguire una query COUNT(*)
separata separata.
Consiglio vivamente la terza opzione. È estremamente veloce se tutto quello che stai facendo è SELECT COUNT(*) FROM table;
. Sarebbe più lento per una query più complessa, ma con l'indicizzazione corretta dovrebbe essere abbastanza veloce per la maggior parte degli scopi.
Per inciso, il valore di ritorno che stai vedendo è sorta di corretta; almeno, per quanto riguarda l'API C MySQL.
Per l'API DB Python definita in PEP 249, the rowcount attribute is -1 if the rowcount of the last operation cannot be determined by the interface. @glglgl spiegato perché il conteggio delle righe non può essere determinato nella loro risposta:
Internamente, SSDictCursor
utilizza mysql_use_result()
che consente al server di avviare il trasferimento dei dati prima che l'acquisizione è stata completata.
In altre parole, il server non conosce il numero di righe che alla fine andrà a recuperare. Quando si esegue una query, MySQLdb
memorizza il valore restituito di mysql_affected_rows()
nell'attributo rowcount
del cursore.Perché il conteggio è indeterminato, questa funzione restituisce -1
come intero senza segno lungo tempo (my_ulonglong
), un tipo numerico che è disponibile nel modulo ctypes
della libreria standard:
>>> from ctypes import c_ulonglong
>>> n = c_ulonglong(-1)
>>> n.value
18446744073709551615L
Un rapido-e-sporco alternativa ctypes
, quando sai che sarai sempre a che fare con un numero intero senza segno a 64 bit, è:
>>> -1 & 0xFFFFFFFFFFFFFFFF
18446744073709551615L
sarebbe bello se MySQLdb
controllati per tale valore di ritorno e ti ha dato il numero intero con segno che ci si aspetta di vedere, ma sfortunatamente no.
Grazie per il downvoting. Cura di spiegare? – glglgl