Sqlalchemy删除子查询

时间:2011-10-25 16:35:53

标签: python sqlalchemy

我正在尝试使用带结果的筛选查询删除一些子行:

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.

我无法找到问题所在......

有什么想法吗?

此致

1 个答案:

答案 0 :(得分:70)

查看发生异常的来源后,我建议您尝试这样做:

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参数基本上会运行两次查询,一次作为选择,一次作为删除。

如果不需要运行两个查询,请改为通过synchronize_session=False,然后在session.expire_all()商店内删除avoid having inconsistent state后立即致电MetaData