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
SeanPlusPlus
la source

Réponses:

136

Essayez delete:

models.User.query.delete()

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

DazWorrall
la source
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()
Steve Saporta
la source
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

Anand Tripathi
la source
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