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

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

寻找这样的东西:

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


# but it errs out: UnmappedInstanceError: Class '__builtin__.list' is not mapped
163602 次浏览

试试 delete:

models.User.query.delete()

来自 那些文件: Returns the number of rows deleted, excluding any cascades.

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

烧瓶-炼金术

删除所有记录

#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

编写原始 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))

当我有一个包含多种类型表的应用程序时,我在删除按钮的 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>'发出请求,文本字符串的值将被用来执行删除操作,并在 物品中重定向到下面的 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'))