如何使用Flask-SQLAlchemy实现批量删除指定patient_id的记录
正确实现Flask-SQLAlchemy批量删除的方法
你的问题出在代码逻辑上:filter_by(patient_id=X).delete()本身就是批量删除操作,它返回的是被删除的记录数量,而不是单个File对象,后续调用session.delete(obj)完全多余,甚至会导致错误。
下面是两种正确的实现方式:
方式一:直接批量删除(最简洁高效)
这是和你目标SQL等价的写法,而且更高效:
# 执行批量删除,返回删除的记录数 deleted_count = File.query.filter_by(patient_id=X).delete() # 提交事务 session.commit()
这段代码会生成SQL:DELETE FROM files WHERE patient_id = X,和你要模拟的子查询效果完全一致,且性能更好。
方式二:用子查询实现(和你原SQL结构一致)
如果一定要对应你写的子查询形式,可以这样构造:
from sqlalchemy import select # 构造子查询 subquery = select(File.id).where(File.patient_id == X) # 执行批量删除,synchronize_session=False避免同步会话对象,提升效率 deleted_count = File.query.filter(File.id.in_(subquery)).delete(synchronize_session=False) session.commit()
这里的synchronize_session参数设置为False是因为批量删除后不需要更新当前会话中的对象,如果你需要同步会话,可以设置为'fetch',但会牺牲一点性能。
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

