Mysql
 sql >> Base de données >  >> RDS >> Mysql

Mettre à jour la table jointe via SQLAlchemy ORM à l'aide de session.query

Depuis la version 0.7.4 sqlalchemy.sql.expression.update vous permet de faire référence à plusieurs tables dans la clause WHERE. Avec cela, vous pouvez construire et exécuter une expression comme :

users.update().values(name='ed').where(
        users.c.name==select([addresses.c.email_address]).\
                    where(addresses.c.user_id==users.c.id).\
                    as_scalar()
        )

(exemple tiré directement du lien ci-dessus)

Le problème rencontré par ValAyal est en fait dû au fait que Query.join() n'est pas pris en charge avec Query.update() . Malheureusement, jusqu'à la version 0.9.1, cela générait silencieusement des requêtes comme celle partagée par ValAyal ci-dessus. Les notes du journal des modifications pour 0.9.1 note que le comportement a été modifié pour émettre un avertissement :

Nous avons en fait rencontré ceci où je travaille ce soir et avons constaté que notre code émettait en fait l'avertissement suivant (qui indique qu'il y aura une erreur dans la version 1.0) :

SAWarning: Can't call Query.update() or Query.delete() when join(), outerjoin(), select_from(), or from_self() has been called.  This will be an exception in 1.0
  self._validate_query_state()

Dans notre cas, nous avons choisi de convertir la mise à jour en une sélection et une mise à jour en une seule table.