Flask-SQLAlchemy comment supprimer toutes les lignes d'une seule table


98

Comment supprimer toutes les lignes d'une seule table à l'aide de Flask-SQLAlchemy?

Vous cherchez quelque chose comme ça:

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

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

Réponses:


136

Essayez delete:

models.User.query.delete()

À partir de la documentation :Returns the number of rows deleted, excluding any cascades.


2
Hmm, cela a fonctionné pour moi, mais seulement après l'avoir changé en quelque chose comme ceci:models.User.query().delete()
killthrush

1
Ne fonctionne pas si vous utilisez une requête comme celle-ci:Model.query.filter(Model.some_id == some_id, Model.other_id.in_(other_ids).delete()
swade

6
N'oubliez pas de vous engager après la suppression.
Kevin

3
Si vous utilisez, Flask-SQLAlchemyessayez en User.query.delete()tant queryqu'objet car l' objet 'BaseQuery' n'est pas appelable. Testé et vérifié.
Shirish Kadam

102

La réponse de DazWorrall est parfaite. Voici une variante qui pourrait être utile si votre code est structuré différemment des OP:

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

N'oubliez pas non plus que la suppression ne prendra effet qu'après votre validation, comme dans cet extrait de code:

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

50

Flacon-Sqlalchemy

Supprimer tous les enregistrements

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

Ligne unique supprimée

ici DB est la classe objet Flask-SQLAlchemy. Il supprimera tous les enregistrements de celui-ci et si vous souhaitez supprimer des enregistrements spécifiques, essayez la filterclause dans la requête. ex.

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

Supprimer un seul enregistrement par objet

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

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


1
Je suis dans une situation similaire. Disons qu'il y a 4 enregistrements dans la table à partir de maintenant, de l'id 1 à 4. Quand je fais une db.session.query (Table_name) .delete () db.session.commit () et puis si je fais une db.session .add () à nouveau pour ajouter de nouveaux enregistrements, l'enregistrement suivant obtient un identifiant de 5. Puisque ma table est maintenant vide, je veux que mes nouveaux enregistrements obtiennent à nouveau un identifiant à partir de 1. Comment puis-je faire ceci ?
qre0ct

Veuillez vous référer à ce lien stackoverflow.com/questions/23038422/…
Anand Tripathi
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.