Wirklich 2 Fragen hier.Verwendung von sqlalchemy Ergebnissatz für Update
Wenn ich eine sqlalchemy Abfrage wie folgt auszuführen:
sensors = session.query(Sensor).filter(Sensor.serial_number.in_(data['sensor_serial_numbers'])).all()
Kann ich dann die Ergebnismenge verwenden (Sensoren), um eine Spalte in all diesen Zeilen zu aktualisieren? Ich konnte nicht die Syntax für das herauszufinden, also versuchte ich dies zu tun:
session.query(Sensor).filter(Sensor.serial_number.in_(data['sensor_serial_numbers'])).update({'system_id': system.id})
Aber das scheitert Weg nach unten in den Schalen von sqlalchemy:
File "/home/ecovent/pyenv0.3/local/lib/python2.7/site-packages/sqlalchemy/orm/persistence.py", line 949, in _do_pre_synchronize
"Could not evaluate current criteria in Python. "
InvalidRequestError: Could not evaluate current criteria in Python. Specify 'fetch' or False for the synchronize_session parameter.
Ich denke, dass wegen der sein muss, in_-Klausel, da ich vor der Verwendung desselben Konstrukts Aktualisierungen vorgenommen habe, aber keine In-Klausel. Wie würde ich ein solches Update mit einem in_ machen?
Vielen Dank. Das funktioniert. Aber können Sie mir bitte sagen, warum dieser Code auch ohne die 'synchronize_session'' session.query (ApplicationInstallation) funktioniert. Filter_by (control_hub_id = hub_id) .filter (ApplicationInstallation.removal_date == Keine) .update ({'removal_date': utc_now}) ' –
@LarryMartell Wenn Sie' in_' entweder eindeutig verwenden oder nicht, ist eine Auswahlabfrage erforderlich, damit MetaData entscheiden kann, welche seiner speicherinternen Objekte ablaufen. Sie können die Select-Abfrage sehen, wenn der Echomodus aktiviert ist, aber ich weiß nicht, warum er so entworfen wurde. – kxxoling
Kann jemand erklären "Wenn die Bewertung der Kriterien nicht umgesetzt wird, wird eine Ausnahme erhoben" bitte? Das * fetch * ist ziemlich geradlinig, aber das * evaluate * scheint mir ein Rätsel zu sein ... – Son