Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Atualize a tabela unida via SQLAlchemy ORM usando session.query


A partir da versão 0.7.4 sqlalchemy.sql.expression.update permite que você faça referência a várias tabelas na cláusula WHERE. Com isso, você pode construir e executar uma expressão 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()
        )

(exemplo direto do link acima)

O problema que ValAyal está tendo é porque Query.join() não é suportado com Query.update() . Infelizmente, até 0.9.1 isso gerava silenciosamente consultas como a que ValAyal compartilhou acima. As notas do changelog para 0.9.1 observa que o comportamento foi modificado para emitir um aviso:

Na verdade, nos deparamos com isso onde eu trabalho esta noite e descobrimos que nosso código está, de fato, emitindo o seguinte aviso (que diz que haverá um erro em 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()

No nosso caso, optamos por converter a atualização em um select e uma atualização em uma tabela.