You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何删除数据库中不在指定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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 15:24:03