Flask-SQLAlchemy как удалить все строки в одной таблице

100

Как удалить все строки в одной таблице с помощью Flask-SQLAlchemy?

Ищу что-то вроде этого:

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

# but it errs out: UnmappedInstanceError: Class '__builtin__.list' is not mapped
SeanPlusPlus
источник

Ответы:

139

Попробуйте delete:

models.User.query.delete()

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

DazWorrall
источник
2
Хм, у меня это сработало, но только после того, как я изменил его на что-то вроде этого:models.User.query().delete()
killthrush
1
Не работает, если вы используете такой запрос:Model.query.filter(Model.some_id == some_id, Model.other_id.in_(other_ids).delete()
swade
7
Не забудьте зафиксировать после удаления.
Кевин
3
Если вы используете, Flask-SQLAlchemyпопробуйте User.query.delete()как queryобъект, так как объект BaseQuery не вызывается. Проверено и проверено.
Shirish Kadam
106

Ответ 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()
Стив Сапорта
источник
51

Flask-Sqlalchemy

Удалить все записи

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

Удалена одна строка

здесь БД - объект класса 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 (Table_name) .delete () db.session.commit (), а затем, если я выполняю db.session .add () снова для добавления новых записей, следующая запись получает идентификатор 5. Поскольку моя таблица теперь пуста, я хочу, чтобы мои новые записи теперь снова получали идентификатор, начинающийся с 1. Как я могу это сделать ?
qre0ct
Пожалуйста, обратитесь к этой ссылке stackoverflow.com/questions/23038422/…
Ананд Трипати,