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.