53 votes

Sqlalchemy supprimer sous-requête

Je tente de supprimer certaines lignes enfants en utilisant une requête filtrée sans résultat :

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

Je reçois l'erreur InvalidRequestError: Could not evaluate current criteria in Python. Specify 'fetch' or False for the synchronize_session parameter..

Trace complète :

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.

Je n'arrive pas à trouver où se situe le problème...

Une idée ?

Cordialement

100voto

wberry Points 6068

Après avoir regardé dans la source où se produit votre exception, je suggère d'essayer ceci :

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

Voir la documentation de la méthode delete pour comprendre ce que cela signifie. Passer l'argument fetch exécutera essentiellement la requête deux fois, une fois en tant que select et une fois en tant que delete.

Si exécuter deux requêtes n'est pas souhaitable, passez plutôt synchronize_session=False et appelez ensuite session.expire_all() immédiatement après la suppression pour éviter d'avoir un état incohérent dans le magasin de MetaData.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X