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
SeanPlusPlus
źródło

Odpowiedzi:

138

Spróbuj delete:

models.User.query.delete()

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

DazWorrall
źródło
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()
Steve Saporta
źródło
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

Anand Tripathi
źródło
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