Flask-SQLAlchemy come eliminare tutte le righe in una singola tabella


97

Come si eliminano tutte le righe in una singola tabella utilizzando Flask-SQLAlchemy?

Alla ricerca di qualcosa di simile:

>>> users = models.User.query.all()
>>> models.db.session.delete(users)

# but it errs out: UnmappedInstanceError: Class '__builtin__.list' is not mapped

Risposte:


137

Prova delete:

models.User.query.delete()

Dai documenti :Returns the number of rows deleted, excluding any cascades.


2
Hmm, questo ha funzionato per me, ma solo dopo averlo cambiato in qualcosa del genere:models.User.query().delete()
killthrush

1
Non funziona se utilizzi una query come questa:Model.query.filter(Model.some_id == some_id, Model.other_id.in_(other_ids).delete()
swade

5
Non dimenticare di eseguire il commit dopo l'eliminazione.
Kevin

3
Se stai usando, Flask-SQLAlchemyprova User.query.delete()come queryoggetto poiché l'oggetto 'BaseQuery' non è richiamabile. Testato e verificato.
Shirish Kadam

99

La risposta di DazWorrall è perfetta. Ecco una variazione che potrebbe essere utile se il tuo codice è strutturato in modo diverso da quello dell'OP:

num_rows_deleted = db.session.query(Model).delete()

Inoltre, non dimenticare che l'eliminazione non avrà effetto finché non ti impegni, come in questo frammento:

try:
    num_rows_deleted = db.session.query(Model).delete()
    db.session.commit()
except:
    db.session.rollback()

50

Flask-Sqlalchemy

Elimina tutti i record

#for all records
db.session.query(Model).delete()
db.session.commit()

Riga singola eliminata

qui DB è l'oggetto della classe Flask-SQLAlchemy. Eliminerà tutti i record da esso e se desideri eliminare record specifici, prova la filterclausola nella query. ex.

#for specific value
db.session.query(Model).filter(Model.id==123).delete()
db.session.commit()

Elimina singolo record per oggetto

record_obj = db.session.query(Model).filter(Model.id==123).first()
db.session.delete(record_obj)
db.session.commit()

https://flask-sqlalchemy.palletsprojects.com/en/2.x/queries/#deleting-records


1
Mi trovo in una situazione simile. Supponiamo che ci siano 4 record nella tabella al momento, da id 1 a 4. Quando eseguo un db.session.query (Table_name) .delete () db.session.commit () e poi se faccio un db.session .add () di nuovo per aggiungere nuovi record, il record successivo ottiene un ID di 5. Poiché la mia tabella è ora vuota, voglio che i miei nuovi record ottengano ora un ID che ricomincia da 1. Come posso fare questo ?
qre0ct

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.