zoukankan      html  css  js  c++  java
  • sqlachemy中批量删除的问题

    db.session.query(Article).filter(Article.id.in_(items)).delete()

    报错:

    sqlalchemy.exc.InvalidRequestError

    InvalidRequestError: Could not evaluate current criteria in Python. Specify 'fetch' or False for the synchronize_session parameter.

    但是:

    db.session.query(Article).filter(Article.id==1).delete()
    db.session.query(Article).filter(Article.id.in_(items))

    都能得到正确的结果。为什么不能直接使用.delete()?

    我按下面的写法能正常工作。

    art_items=Article.query.filter(Article.id.in_(items))
    for item in art_items:
        db.session.delete(item)
    db.session.commit()

    就是希望了解一下原理。为什么不能在使用_in的时候直接后面接delete()?


    为什么无法删除 in 操作查询出来的记录?

    session.query(User).filter(User.id.in_((1, 2, 3))).delete()
    

    抛出这样的异常:

    sqlalchemy.exc.InvalidRequestError: Could not evaluate current criteria in Python.  Specify 'fetch' or False for the synchronize_session parameter.
    

    但这样是没问题的:

    session.query(User).filter(or_(User.id == 1, User.id == 2, User.id == 3)).delete()
    

    搜了下找到《Sqlalchemy delete subquery》这个问题,提到了 delete 的一个注意点:删除记录时,默认会尝试删除 session 中符合条件的对象,而 in 操作估计还不支持,于是就出错了。解决办法就是删除时不进行同步,然后再让 session 里的所有实体都过期:

    session.query(User).filter(User.id.in_((1, 2, 3))).delete(synchronize_session=False)
    session.commit() # or session.expire_all()
    

    此外,update 操作也有同样的参数,如果后面立刻提交了,那么加上 synchronize_session=False 参数会更快。

  • 相关阅读:
    Visual C# 3.0 新特性概览
    一个C#睡前故事[翻译]
    ASP.NET User Control使用技巧一则
    Visual Studio 2005 调试器的新增功能
    .NET Framework 3.0新特性
    客户端提高WEB页面显示速度的方法
    VS.Net 2005中如何:使用“编辑并继续”
    如何在 VS 2005 里调试 Javascript
    关于DotNES
    Sql语句优化汇总(CSDN上的帖子)
  • 原文地址:https://www.cnblogs.com/zknublx/p/8795621.html
Copyright © 2011-2022 走看看