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

142

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

寻找类似以下代码:

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

# but it errs out: UnmappedInstanceError: Class '__builtin__.list' is not mapped
5个回答

191

试试delete

models.User.query.delete()

根据文档,该方法返回删除的行数,不包括任何级联操作。


3
这个对我来说有用,但只有在像这样更改后才有效:models.User.query().delete() - killthrush
1
如果您使用以下查询,则无法正常工作: Model.query.filter(Model.some_id == some_id, Model.other_id.in_(other_ids).delete() - swade
11
删除后不要忘记提交。 - Kevin
11
如果你正在使用Flask-SQLAlchemy,那么请尝试使用User.query.delete(),因为query对象是可调用的 BaseQuery 对象。经过测试验证。 - Shirish Kadam

144

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()

89

Flask-Sqlalchemy

删除所有记录

#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条记录,从id 1到4。当我执行db.session.query(Table_name).delete() db.session.commit()后,如果我再次执行db.session.add()以添加新记录,则下一条记录将获得id 5。由于我的表现在是空的,我希望我的新记录从1开始获得id。我该怎么做? - qre0ct
请参考此链接:https://dev59.com/U37aa4cB1Zd3GeqPtKqX - Anand Tripathi

0

有时编写原始的 SQL 命令是很有用的

    def delete_table_content(self, table_name: str):
          "deletes table contents"
          CONNECTION = db_url
          conn = psycopg2.connect(CONNECTION)
          conn.autocommit = True
          cursor = conn.cursor()
          cursor.execute("TRUNCATE TABLE {}".format(table_name))
          logger.warning("deleted table {} content".format(table_name))

0

当我有一个包含多种类型表格的应用程序时,我会在删除按钮的URL中传递ID和TYPE参数,例如:

<a href="{{ url_for('app.cleartable',type='items') }}" class="btn btn-danger">
    <i class="fas fa-trash fa-fw"></i>
    Clear table
</a>

现在,如果您向'/delete/<string:type>/<int:id>'发出请求,则将使用文本字符串的值进行删除,并重定向到items中的以下url

@app.route('/delete/<string:type>/<int:id>', methods=['POST', 'GET'])
def delete(type, id):
    if type == "item":
        to_delete = Item.query.get(id)

        try:
            db.session.delete(to_delete)
            db.session.commit()
            flash(f'{to_delete.name} successfully deleted!', 'success')
        except:
            db.session.rollback() 
            flash(f'{to_delete.name} failed to delete!', 'error')
        return redirect(url_for('items'))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接