sql >> Base de Datos >  >> RDS >> Mysql

Actualice la tabla unida a través de SQLAlchemy ORM usando session.query

A partir de la versión 0.7.4 sqlalchemy.sql.expresión.actualización le permite referirse a varias tablas en la cláusula WHERE. Con esto, podría construir y ejecutar una expresión como:

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

(ejemplo directo del enlace de arriba)

El problema que tiene ValAyal es en realidad porque Query.join() no es compatible con Query.update() . Desafortunadamente, hasta la versión 0.9.1, esto generaba silenciosamente consultas como la que ValAyal compartió anteriormente. Las notas del registro de cambios para 0.9.1 señala que el comportamiento se modificó para emitir una advertencia:

De hecho, nos encontramos con esto donde trabajo justo esta noche y descubrimos que nuestro código, de hecho, emite la siguiente advertencia (que dice que será un error en 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()

En nuestro caso, optamos por convertir la actualización en una selección y una actualización de una tabla.