Flask-SQLAlchemy如何删除单个表中的所有行


97

如何使用Flask-SQLAlchemy删除单个表中的所有行?

寻找这样的事情:

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

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

Answers:


137

尝试delete

models.User.query.delete()

文档Returns the number of rows deleted, excluding any cascades.


2
嗯,这对我models.User.query().delete()
有用

1
如果使用这样的查询,则不起作用:Model.query.filter(Model.some_id == some_id, Model.other_id.in_(other_ids).delete()
swade

5
删除后不要忘记提交。
凯文

3
如果正在使用,Flask-SQLAlchemy则尝试User.query.delete()作为query对象,因为“ BaseQuery”对象不可调用。经过测试和验证。
Shirish Kadam19年

99

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查询中的try 子句。例如

#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条记录,从id 1到4。当我执行db.session.query(Table_name).delete()db.session.commit()时,然后如果我执行db.session再次使用.add()添加新记录,下一条记录的ID为5。由于我的表现在为空,我希望新记录的ID再次从1开始。我怎样才能做到这一点 ?
qre0ct '16

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.