2010-07-27 19 views
6

È possibile verificare quante righe sono state cancellate da una query?Quante righe sono state cancellate?

queryset = MyModel.object.filter(foo=bar) 
queryset.delete() 
deleted = ... 

O dovrei utilizzare le transazioni per questo?

@transaction.commit_on_success 
def delete_some_rows(): 
    queryset = MyModel.object.filter(foo=bar) 
    deleted = queryset.count() 
    queryset.delete() 

PHP + MySQL esempio:

mysql_query('DELETE FROM mytable WHERE id < 10'); 
printf("Records deleted: %d\n", mysql_affected_rows()); 
+0

Hmm, beh 'queryset.delete()' dovrebbe eliminare 'len (queryset)' numero di oggetti, ma per ottenere il numero di righe interessate da MySQL dovresti usare [MySQLdb] (http: // mysql-python .sourceforge.net/MySQLdb.html) driver direttamente penso. –

risposta

0

non capisco il motivo per cui queryset.count() o queryset.distinct().count() non è sufficiente.

+2

È sufficiente, ma produce più query. L'esempio di PHP + MySQL è solo una richiesta singola al DBMS. Anche il codice IMO PHP è più esplicito. Non ho problemi di prestazioni o qualcosa del genere, quindi devo farlo in una singola query. Sono solo curioso. –

+2

Si può anche avere accesso all'attributo 'rowcount' del sottostante cursore' MySQLdb', ma è hack-ish: 'base_cursor = connection.cursor(). Cursor' (o' base_cursor = connection.cursor(). Cursor. cursor' se 'DEBUG' è impostato su' True'). –

+1

Devi capire che l'ORM che stai utilizzando in Django è un livello di astrazione più alto del driver di database che consente alla tua app di essere indipendente dal database, ma puoi comunque utilizzare il driver del database per comunicare con il database sottostante come fai nel tuo esempio PHP , ma dovresti rendere dipendente il tuo database dell'app. –

2

Esistono molte situazioni in cui si desidera sapere quante righe sono state eliminate, ad esempio se si fa qualcosa in base al numero di righe eliminate. Controllandolo eseguendo un COUNT si crea un carico extra del database e non è atomico.

Il metodo queryset.delete() elimina immediatamente l'oggetto e restituisce il numero di oggetti eliminati e un dizionario con il numero di cancellazioni per tipo di oggetto. Controlla i documenti per ulteriori dettagli: https://docs.djangoproject.com/en/1.9/topics/db/queries/#deleting-objects

0

Righe reali interessate che è possibile visualizzare con SELECT row_count(). Prima di tutto qs.count() e cursor.rowcount non sono le stesse cose!

In MySQL con InnoDB con REPEATABLE READ (modalità predefinita) READ query e query WRITE view !! DIFFERENTE !!! querysets!

READ query lette da vecchia istantanea, mentre la query Scrivete dati effettivi impegnati, come se funziona in modalità READ COMMITTED.

Problemi correlati