Flask-SQLAlchemy, jak usunąć wszystkie wiersze z jednej tabeli


98

Jak usunąć wszystkie wiersze z jednej tabeli przy użyciu Flask-SQLAlchemy?

Szukam czegoś takiego:

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

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

Odpowiedzi:


138

Spróbuj delete:

models.User.query.delete()

Z dokumentów :Returns the number of rows deleted, excluding any cascades.


2
Hmm, u mnie to zadziałało, ale dopiero po zmianie na coś takiego:models.User.query().delete()
killthrush

1
Nie działa, jeśli używasz takiego zapytania:Model.query.filter(Model.some_id == some_id, Model.other_id.in_(other_ids).delete()
swade

6
Nie zapomnij o zatwierdzeniu po usunięciu.
Kevin

3
Jeśli używasz, Flask-SQLAlchemyspróbuj User.query.delete()jako queryobiekt, ponieważ obiekt „BaseQuery” nie jest wywoływalny. Przetestowane i zweryfikowane.
Shirish Kadam

103

Odpowiedź DazWorrall jest trafna. Oto odmiana, która może być przydatna, jeśli Twój kod ma inną strukturę niż OP:

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

Nie zapominaj też, że usunięcie nie odniesie skutku, dopóki nie zatwierdzisz, jak w tym fragmencie:

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

51

Flask-Sqlalchemy

Usuń wszystkie rekordy

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

Usunięto jeden wiersz

tutaj DB jest obiektem klasy Flask-SQLAlchemy. Usunie z niego wszystkie rekordy i jeśli chcesz usunąć określone rekordy, spróbuj użyć filterklauzuli w zapytaniu. dawny.

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

Usuń pojedynczy rekord według obiektu

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
Jestem w podobnej sytuacji. Załóżmy, że w tej chwili w tabeli są 4 rekordy, od identyfikatora 1 do 4. Kiedy wykonuję db.session.query (nazwa_tabeli) .delete () db.session.commit (), a następnie, gdy wykonuję db.session .add () ponownie, aby dodać nowe rekordy, następny rekord otrzyma identyfikator 5. Ponieważ moja tabela jest teraz pusta, chcę, aby moje nowe rekordy miały teraz ponownie identyfikator zaczynający się od 1. Jak mogę to zrobić ?
qre0ct

Proszę odnieść się do tego linku stackoverflow.com/questions/23038422/…
Anand Tripathi
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.