2015-11-13 11 views
7

Davvero 2 domande qui.Utilizzo del set di risultati sqlalchemy per l'aggiornamento

Se corro una query sqlalchemy come questo:

sensors = session.query(Sensor).filter(Sensor.serial_number.in_(data['sensor_serial_numbers'])).all() 

Posso quindi utilizzare il set di risultati (sensori) per aggiornare una colonna in tutte le righe? Non riuscivo a capire la sintassi per questo, così ho provato a fare questo:

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

Ma che non riesce fino in fondo nelle ciotole di 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. 

penso che deve essere a causa della clausola in_, dato che ho fatto degli aggiornamenti prima di usare lo stesso costrutto, ma non avevano una clausola in_. Come potrei fare un aggiornamento come questo con un in_?

risposta

14

Prova questo:

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

E 'documentato qui: doc

Il valore di default è evaluate che

valutare i criteri della query in Python dritto sugli oggetti nella sessione . Se la valutazione dei criteri non viene implementata, viene sollevata un'eccezione .

+0

Grazie mille. Questo funziona. Ma puoi dirmi perché questo codice funziona anche senza 'synchronize_session'' session.query (ApplicationInstallation) .filter_by (control_hub_id = hub_id) .filter (ApplicationInstallation.removal_date == None) .update ({'removal_date': utc_now}) ' –

+2

@LarryMartell Quando si utilizza' in_', distintamente o meno, è necessaria una query di selezione per consentire a MetaData di decidere quale dei suoi oggetti in memoria scadrà. Puoi vedere la query di selezione se la modalità eco è attivata, ma non so perché è progettata in questo modo. – kxxoling

+0

Qualcuno può spiegare "Se la valutazione dei criteri non è implementata, viene sollevata un'eccezione" per favore? Il * recupero * è abbastanza semplice ma * valutare * sembra un po 'un mistero per me ... – Son

Problemi correlati