2015-11-13 11 views
7

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?

Antwort

14

Try this:

session.query(Sensor)\ 
    .filter(Sensor.serial_number.in_(data['sensor_serial_numbers']))\ 
    .update({'system_id': system.id}, synchronize_session='fetch') 

Es ist dokumentiert hier: doc

Der Standardwert ist evaluate die

der Abfrage Kriterien in Python gerade auf die Objekte in der Sitzung auswerten. Wenn die Bewertung der Kriterien nicht implementiert ist, wird eine Ausnahme ausgelöst.

+0

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}) ' –

+2

@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

+0

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

Verwandte Themen