Flask-SQLAlchemy, як видалити всі рядки в одній таблиці


98

Як видалити всі рядки в одній таблиці за допомогою Flask-SQLAlchemy?

Шукаємо щось подібне:

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

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

Відповіді:


136

Спробуйте delete:

models.User.query.delete()

З документів :Returns the number of rows deleted, excluding any cascades.


2
Хм, це у мене спрацювало, але лише після того, як я змінив його на щось подібне:models.User.query().delete()
— killthrush

1
Не працює, якщо ви використовуєте такий запит:Model.query.filter(Model.some_id == some_id, Model.other_id.in_(other_ids).delete()
— swade

6
Не забудьте зробити коміт після видалення.
— Кевін

3
Якщо ви використовуєте, Flask-SQLAlchemyспробуйте User.query.delete()як queryоб'єкт, оскільки об'єкт 'BaseQuery' не можна викликати. Перевірено та перевірено.
— Ширіш Кадам

102

Відповідь DazWorrall на місці. Ось варіант, який може бути корисним, якщо ваш код структурований інакше, ніж OP:

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

Також не забувайте, що видалення не набуде чинності, доки ви не здійсните комітування, як у цьому фрагменті:

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

50

Колба-Склалхімія

Видалити всі записи

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

Видалено один рядок

тут DB є об'єктом класу Flask-SQLAlchemy. Він видалить з нього всі записи, і якщо ви хочете видалити конкретні записи, спробуйте filterпункт у запиті. напр.

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

Видалити один запис за об’єктом

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
Я потрапив у подібну ситуацію. Скажімо, на даний момент в таблиці є 4 записи, від ідентифікатора 1 до 4. Коли я роблю db.session.query (ім'я_таблиці) .delete () db.session.commit (), а потім, якщо я роблю db.session .add () знову, щоб додати нові записи, наступний запис отримує ідентифікатор 5. Оскільки моя таблиця порожня, я хочу, щоб мої нові записи тепер знову отримували ідентифікатор, починаючи з 1. Як я можу це зробити?
— qre0ct

Будь ласка, зверніться до цього посилання stackoverflow.com/questions/23038422/…
— Ананд Трипаті
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.