So löschen Sie einen Datensatz anhand der ID in Flask-SQLAlchemy


127

Ich habe eine usersTabelle in meiner MySQL-Datenbank. Diese Tabelle hat id, nameund ageFelder.

Wie kann ich einen Datensatz von löschen id?

Jetzt benutze ich folgenden Code:

user = User.query.get(id)
db.session.delete(user)
db.session.commit()

Ich möchte jedoch vor dem Löschvorgang keine Abfrage durchführen. Gibt es eine Möglichkeit, dies zu tun? Ich weiß, ich kann verwenden db.engine.execute("delete from users where id=..."), aber ich möchte delete()Methode verwenden.

Antworten:


206

Du kannst das,

User.query.filter_by(id=123).delete()

oder

User.query.filter(User.id == 123).delete()

Stellen Sie sicher, commitdass delete()Sie wirksam werden.


19
Stellen Sie sicher, dass Sie db.session.commit()am Ende setzen. wo die db: db = SQLAlchemy(app)
Ben

Können Sie IN mit dieser Methode verwenden?
Ram4nd

10
Warnung: Dies deletewird nicht kaskadiert, wenn Sie sich auf die Kaskadierung in Python / ORM verlassen. Sie müssen das Objekt zuerst abfragen und dann löschen .
Nirvana-Msu

5
Was würde passieren, wenn Useres nicht existiert?
Senaps

Wie können wir diese delete () -Methode überschreiben / erweitern? für eine Klasse Benutzerdefiniert in unserer models.py in der Kolben-App.
Hossein

35

Ich möchte nur eine andere Option teilen:

# mark two objects to be deleted
session.delete(obj1)
session.delete(obj2)

# commit (or flush)
session.commit()

http://docs.sqlalchemy.org/en/latest/orm/session_basics.html#deleting

In diesem Beispiel müssen die folgenden Codes einwandfrei funktionieren:

obj = User.query.filter_by(id=123).one()
session.delete(obj)
session.commit()

Ich erhalte die Fehlermeldung, dass die Sitzung verwendet wird
Ryan Aquino

9

Eine weitere mögliche Lösung, insbesondere wenn Sie einen Stapel löschen möchten

deleted_objects = User.__table__.delete().where(User.id.in_([1, 2, 3]))
session.execute(deleted_objects)
session.commit()
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.