Sqlalchemy 删除子查询

57 投票
1 回答
36988 浏览
提问于 2025-04-17 04:58

我正在尝试通过一个过滤查询来删除一些子行,但没有结果:

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 个回答

100

在查看了你出现异常的源代码后,我建议你试试这个:

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

你可以查看删除方法的文档,了解这是什么意思。传递fetch参数基本上会让查询执行两次,一次是选择数据,一次是删除数据。

如果你不想执行两次查询,可以传递synchronize_session=False,然后在删除操作后立即调用session.expire_all(),这样可以避免在MetaData存储中出现不一致的状态

撰写回答