我尝试使用过滤查询删除一些子行,但没有结果:
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.
我找不到问题出在哪里了...
有什么想法吗?
谢谢
in_
,因此MetaData
需要执行一个select
查询来确定需要过期的内存对象。传递此选项可以让它获得执行该查询的权限。无条件地执行此操作可能会在某些情况下导致性能不佳。 - wberryexpire_all
。如果在同一数据库事务中在此删除之前进行了其他操作,则会话中可能存在没有对应表中行的对象! - wberryDBSession
和session
究竟是什么? - Hosein Aqajanisession
对象本质上是累积映射对象所做的更改,并从中计算在提交时需要执行哪些查询。Session 对象是短暂的,由一个工厂对象创建,按惯例称为Session
(大写 S)。Session 对象的寿命应该很短,范围应该限制在单个事务中,并且不应该共享。 - wberry