Sqlalchemy delete subquery
Question:
I am trying to delete some child rows using a filtered query without result:
sl = DBSession.query(Puesto.id).filter(Puesto.locales_id == id).subquery()
DBSession.query(Servicio).filter(Servicio.puestos_id.in_(sl)).delete()
I am getting InvalidRequestError: Could not evaluate current criteria in Python. Specify 'fetch' or False for the synchronize_session parameter.
as error.
Full stack trace:
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.
I am not be able to find where the problem is…
Any idea?
Regards
Answers:
After looking in the source where your exception occurs I suggest trying this:
sl = DBSession.query(Puesto.id).filter(Puesto.locales_id == id).subquery()
DBSession.query(Servicio).filter(Servicio.puestos_id.in_(sl))
.delete(synchronize_session='fetch')
See the documentation of the delete method for what this means. Passing the fetch
argument will basically run the query twice, once as a select and once as a delete.
If running two queries is not desired, pass synchronize_session=False
instead and then call session.expire_all()
immediately after the delete to avoid having inconsistent state within the MetaData
store.
I am trying to delete some child rows using a filtered query without result:
sl = DBSession.query(Puesto.id).filter(Puesto.locales_id == id).subquery()
DBSession.query(Servicio).filter(Servicio.puestos_id.in_(sl)).delete()
I am getting InvalidRequestError: Could not evaluate current criteria in Python. Specify 'fetch' or False for the synchronize_session parameter.
as error.
Full stack trace:
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.
I am not be able to find where the problem is…
Any idea?
Regards
After looking in the source where your exception occurs I suggest trying this:
sl = DBSession.query(Puesto.id).filter(Puesto.locales_id == id).subquery()
DBSession.query(Servicio).filter(Servicio.puestos_id.in_(sl))
.delete(synchronize_session='fetch')
See the documentation of the delete method for what this means. Passing the fetch
argument will basically run the query twice, once as a select and once as a delete.
If running two queries is not desired, pass synchronize_session=False
instead and then call session.expire_all()
immediately after the delete to avoid having inconsistent state within the MetaData
store.