Sqlalchemy删除子查询

2024-09-28 21:08:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用筛选查询删除一些子行,但没有结果:

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.

我找不到问题所在。。。

知道吗?

问候


Tags: inidnotcurrentfilterquerydeletecould
1条回答
网友
1楼 · 发布于 2024-09-28 21:08:00

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

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

这意味着什么,请参见documentation of the delete method。传递fetch参数基本上将运行查询两次,一次作为select,一次作为delete。

如果不需要运行两个查询,请改为传递synchronize_session=False,然后在删除后立即调用session.expire_all()MetaData存储中的avoid having inconsistent state

相关问题 更多 >