如何使用Flask-SQLAlchemy删除单个表中的所有行?
寻找类似以下代码:
>>> users = models.User.query.all()
>>> models.db.session.delete(users)
# but it errs out: UnmappedInstanceError: Class '__builtin__.list' is not mapped
如何使用Flask-SQLAlchemy删除单个表中的所有行?
寻找类似以下代码:
>>> users = models.User.query.all()
>>> models.db.session.delete(users)
# but it errs out: UnmappedInstanceError: Class '__builtin__.list' is not mapped
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>'
发出请求,则将使用文本字符串的值进行删除,并重定向到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'))
models.User.query().delete()
。 - killthrushModel.query.filter(Model.some_id == some_id, Model.other_id.in_(other_ids).delete()
- swadeFlask-SQLAlchemy
,那么请尝试使用User.query.delete()
,因为query
对象是可调用的BaseQuery
对象。经过测试验证。 - Shirish Kadam