Sono nuovo di SQLAlchemy e ho ereditato un codebase un po 'disordinato senza accesso all'autore originale.Quando dovrei chiamare flush() su SQLAlchemy?
Il codice è scritto con chiamate a DBSession.flush()
, apparentemente in qualsiasi momento l'autore desiderava assicurarsi che i dati fossero salvati. All'inizio stavo solo seguendo gli schemi che ho visto in questo codice, ma mentre sto leggendo i documenti, sembra che questo non sia necessario - che l'autoflushing dovrebbe essere installato. Inoltre, sono entrato in alcuni casi con chiamate AJAX che generano l'errore "InvalidRequestError: Session sta già scaricando".
In quali scenari vorrei legittimamente mantenere una chiamata a flush()?
Si tratta di un'applicazione piramide, e SQLAlchemy è in corso di installazione con:
DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension(), expire_on_commit=False))
Base = declarative_base()
Grazie mille. Follow up: cosa costituisce una buona ragione per avere expire_on_commit = False in questa configurazione? (Non so perché è stato impostato in questo modo in primo luogo). – blocks
Nella mia esperienza, è usato da persone che non sanno quello che stanno facendo e cercano di imbrogliare il sistema usando gli oggetti dopo che sono stati commessi. * ovviamente * dopo un commit, non si ha alcuna garanzia che lo stato di quell'oggetto sia più valido. –
@ Michael Merickel - Molto ben spiegato. Che ne dici di quando non dovremmo usare flush()? [Ci sono effetti collaterali dal chiamare SQLAlchemy flush() nel codice?] (Http://stackoverflow.com/questions/29338419/are-there-any-side-effects-from-calling-sqlalchemy-flush-within-code) –