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
SeanPlusPlus
quelle

Antworten:

137

Versuchen Sie delete:

models.User.query.delete()

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

DazWorrall
quelle
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()
Steve Saporta
quelle
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

Anand Tripathi
quelle
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