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.