如何删除数据库中不在指定ID列表的记录并解决filter_by参数错误
问题解决
错误根因
你触发报错的核心原因是混淆了SQLAlchemy中filter()和filter_by()的用法规则:
filter_by()仅支持**关键字参数(key=value格式)**做等值查询,不支持~取反、in_这类运算表达式,也不接受非关键字格式的位置参数- 包含运算表达式的复杂条件需要用
filter()传入,多个条件逗号分隔时会自动按AND逻辑拼接
正确写法
写法1:所有条件都用filter()传入
注意filter()中等值判断需要用双等号==:
devices = session.query(Model).filter( ~Model.device_uuid.in_(devices_list), Model.draft_id == draft.id ).delete()
写法2:复杂条件用filter(),简单等值条件用filter_by()组合
两种过滤方法可以链式调用:
devices = session.query(Model).filter( ~Model.device_uuid.in_(devices_list) ).filter_by( draft_id=draft.id ).delete()
注意事项
- 执行删除操作后需要调用
session.commit(),变更才会真正提交到数据库 - 建议删除前先执行查询校验待删除数据是否符合预期,避免误删:
# 先查询确认待删除记录 to_delete = session.query(Model).filter( ~Model.device_uuid.in_(devices_list), Model.draft_id == draft.id ).all() # 确认记录无误后再执行删除 session.query(Model).filter( ~Model.device_uuid.in_(devices_list), Model.draft_id == draft.id ).delete() session.commit()
内容的提问来源于stack exchange,提问作者newbir
相关产品推荐
相关产品推荐

