Mysql
 sql >> Database >  >> RDS >> Mysql

Aggiorna la tabella unita tramite SQLAlchemy ORM usando session.query

A partire dalla versione 0.7.4 sqlalchemy.sql.expression.update ti consente di fare riferimento a più tabelle nella clausola WHERE. Con questo, puoi costruire ed eseguire un'espressione come:

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

(esempio direttamente dal link sopra)

Il problema che ValAyal sta avendo è in realtà perché Query.join() non è supportato con Query.update() . Sfortunatamente, fino alla 0.9.1 questo generava silenziosamente query come quella condivisa da ValAyal sopra. Le note del registro delle modifiche per 0.9.1 rileva che il comportamento è stato modificato per emettere un avviso:

In realtà ci siamo imbattuti in questo dove lavoro proprio questa sera e ho scoperto che il nostro codice sta, in effetti, emettendo il seguente avviso (che dice che sarà un errore in 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()

Nel nostro caso, abbiamo deciso di convertire l'aggiornamento in una selezione e un aggiornamento in una tabella.