Flask-SQLAlchemy wie alle Zeilen in einer einzigen Tabelle gelöscht werden


95

Wie lösche ich mit Flask-SQLAlchemy alle Zeilen in einer einzelnen Tabelle?

Auf der Suche nach so etwas:

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

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

Antworten:


137

Versuchen Sie delete:

models.User.query.delete()

Aus den Dokumenten :Returns the number of rows deleted, excluding any cascades.


1
Hmm, das hat bei mir funktioniert, aber erst nachdem ich es in so etwas models.User.query().delete()
geändert habe

1
Funktioniert nicht, wenn Sie eine Abfrage wie diese verwenden:Model.query.filter(Model.some_id == some_id, Model.other_id.in_(other_ids).delete()
Swade

5
Vergessen Sie nicht, nach dem Löschen ein Commit durchzuführen.
Kevin

3
Wenn Sie verwenden, Flask-SQLAlchemyversuchen Sie es User.query.delete()als queryObjekt, da das 'BaseQuery'-Objekt nicht aufrufbar ist. Getestet und verifiziert.
Shirish Kadam

99

DazWorralls Antwort ist genau richtig. Hier ist eine Variante, die nützlich sein kann, wenn Ihr Code anders strukturiert ist als die des OP:

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

Vergessen Sie auch nicht, dass das Löschen erst nach dem Festschreiben wirksam wird, wie in diesem Snippet:

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

49

Flask-Sqlalchemy

Alle Datensätze löschen

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

Einzelne Zeile gelöscht

Hier ist DB das Objekt Flask-SQLAlchemy-Klasse. Es werden alle Datensätze daraus gelöscht. Wenn Sie bestimmte Datensätze löschen möchten, versuchen Sie es mit einer filterKlausel in der Abfrage. Ex.

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

Einzelnen Datensatz nach Objekt löschen

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

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


1
Ich bin in einer ähnlichen Situation. Angenommen, die Tabelle enthält ab sofort 4 Datensätze von ID 1 bis 4. Wenn ich eine db.session.query (Tabellenname) .delete () db.session.commit () und dann eine db.session durchführe .add () erneut, um neue Datensätze hinzuzufügen. Der nächste Datensatz erhält die ID 5. Da meine Tabelle jetzt leer ist, möchte ich, dass meine neuen Datensätze jetzt eine ID ab 1 erhalten. Wie kann ich das machen ?
qre0ct

Bitte beziehen Sie sich auf diesen Link stackoverflow.com/questions/23038422/…
Anand Tripathi
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.