SQLAlchemy删除子查询

发布于 2021-01-29 15:09:07

我试图使用没有结果的过滤查询删除一些子行:

sl = DBSession.query(Puesto.id).filter(Puesto.locales_id == id).subquery()
DBSession.query(Servicio).filter(Servicio.puestos_id.in_(sl)).delete()

我得到InvalidRequestError: Could not evaluate current criteria in Python. Specify 'fetch' or False for the synchronize_session parameter.了错误。

全栈跟踪:

Traceback (most recent call last):
  File "/usr/src/tg2env/ceaf/ceaf/controllers/root.py", line 1673, in delete_local
    DBSession.query(Servicio).filter(Servicio.puestos_id.in_(sl)).delete()
  File "/usr/src/tg2env/lib/python2.4/site-packages/SQLAlchemy-0.6.6-py2.4.egg/sqlalchemy/orm/query.py", line 2126, in delete
    raise sa_exc.InvalidRequestError(
InvalidRequestError: Could not evaluate current criteria in Python.  Specify 'fetch' or False for the synchronize_session parameter.

我无法找到问题所在。

任何想法?

问候

关注者
0
被浏览
77
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    在查找您的异常发生的源之后,我建议尝试以下操作:

    sl = DBSession.query(Puesto.id).filter(Puesto.locales_id == id).subquery()
    DBSession.query(Servicio).filter(Servicio.puestos_id.in_(sl)) \
    .delete(synchronize_session='fetch')
    

    请参阅delete方法文档以了解其含义。传递fetch参数将基本上运行查询两次,一次为选择,一次为删除。

    如果运行两个查询是不希望的,通过synchronize_session=False代替,然后调用session.expire_all()立即删除后,以避免不一致的状态的内部MetaData存储。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看