Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Aktualisieren Sie die verbundene Tabelle über SQLAlchemy ORM mit session.query

Ab Version 0.7.4 sqlalchemy.sql.expression.update erlaubt es Ihnen, auf mehrere Tabellen in der WHERE-Klausel zu verweisen. Damit könnten Sie einen Ausdruck wie diesen erstellen und ausführen:

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

(Beispiel direkt aus dem obigen Link)

Das Problem, das ValAyal hat, liegt eigentlich daran, dass Query.join() wird mit Query.update() nicht unterstützt . Leider generierte dies bis 0.9.1 stillschweigend Abfragen wie die, die ValAyal oben geteilt hat. Die Änderungsprotokollnotizen für 0.9.1 stellt fest, dass das Verhalten geändert wurde, um eine Warnung auszugeben:

Wir sind gerade heute Abend bei meiner Arbeit darauf gestoßen und haben festgestellt, dass unser Code tatsächlich die folgende Warnung ausgibt (die besagt, dass es sich um einen Fehler in 1.0 handelt):

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()

In unserem Fall haben wir uns dafür entschieden, das Update in eine Auswahl und ein Update in eine Tabelle umzuwandeln.