Comment supprimer un enregistrement par identifiant dans Flask-SQLAlchemy


128

J'ai une userstable dans ma base de données MySql. Ce tableau a id, nameet les agechamps.

Comment puis-je supprimer un enregistrement par id?

Maintenant, j'utilise le code suivant:

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

Mais je ne veux faire aucune requête avant l'opération de suppression. Y a-t-il un moyen de faire ça? Je sais, je peux utiliser db.engine.execute("delete from users where id=..."), mais je voudrais utiliser la delete()méthode.

Réponses:


206

Tu peux le faire,

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

ou

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

Assurez-vous que commitpour delete()prendre effet.


19
assurez-vous de mettre db.session.commit()à la fin. où le db: db = SQLAlchemy(app)
Ben

Pouvez-vous utiliser IN avec cette méthode?
ram4nd

10
Attention: deletecela ne sera pas en cascade si vous comptez sur la cascade en python / ORM. Vous devrez d'abord interroger l'objet, puis supprimer .
nirvana-msu

5
que se passerait-il s'il Usern'existait pas?
senaps le

comment pouvons-nous remplacer / étendre cette méthode delete ()? pour une classe User définie dans notre models.py dans l'application flask.
Hossein

36

Je veux juste partager une autre option:

# 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

Dans cet exemple, les codes suivants fonctionnent correctement:

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

Je reçois une erreur indiquant que la session est en cours d'utilisation
Ryan Aquino

9

Une autre solution possible spécialement si vous souhaitez une suppression par lots

deleted_objects = User.__table__.delete().where(User.id.in_([1, 2, 3]))
session.execute(deleted_objects)
session.commit()
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.