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.

Sergey
quelle

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.

adarsh
quelle
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()
Steve
quelle
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()
Zaytsev Dmitry
quelle