Sqlalchemy удалить подзапрос - PullRequest
       4

Sqlalchemy удалить подзапрос

41 голосов
/ 25 октября 2011

Я пытаюсь удалить некоторые дочерние строки, используя отфильтрованный запрос без результата:

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 Ответ

71 голосов
/ 31 октября 2011

После поиска источника, где происходит ваше исключение, я предлагаю попробовать это:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...