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
После поиска в источнике, где происходит ваше исключение, я предлагаю попробовать следующее:
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
.