2012-08-24 14 views
5

Ho un problema con SQL Alchemy - la mia app funziona come un'applicazione python costantemente funzionante.Come evitare la memorizzazione nella cache in sqlalchemy?

devo funzione come questa:

def myFunction(self, param1): 
    s = select([statsModel.c.STA_ID, statsModel.c.STA_DATE)])\ 
         .select_from(statsModel) 

    statsResult = self.connection.execute(s).fetchall() 

    return {'result': statsResult, 'calculation': param1} 

Credo che questo sia chiaro esempio - un set di risultati vengono recuperati dal database, il secondo è appena passato come argomento.

Il problema è che quando cambio i dati nel mio database, questa funzione restituisce comunque dati come se nulla fosse cambiato. Quando cambio i dati nel parametro di input, il parametro restituito "calcolo" ha il valore corretto.

Quando riavvio il server dell'app, la situazione torna normale - i nuovi dati vengono recuperati da MySQL.

So che ci sono state diverse domande su SQLAlchemy caching come:

How to disable caching correctly in Sqlalchemy orm session?

How to disable SQLAlchemy caching?

ma come altro posso chiamare questa situazione? Sembra che SQLAlchemy mantenga i dati recuperati prima e non esegua nuove query fino al riavvio dell'applicazione. Come posso evitare questo comportamento?

+0

Come si modificano i dati nel database? È cambiato? – icecrime

+0

L'ho cambiato manualmente. Il motore del database è MySQL. Sì, il cambiamento è impegnato. – Archarius

+0

http://stackoverflow.com/a/15788051/497208 può essere utile –

risposta

1

Alcune possibilità.

  1. Si sta riutilizzando il session in modo improprio o in un momento improprio. La migliore pratica è quella di gettare via il tuo session dopo aver eseguito il commit e ottenerne uno nuovo all'ultimo momento possibile prima di utilizzarlo. Il comportamento che sembra essere il caching potrebbe infatti essere dovuto al fatto che una vita di session è molto lunga nell'applicazione.
  2. Gli oggetti che sopravvivono più a lungo dello session non vengono uniti in uno session successivo. I "metadati" potrebbero non essere in grado di aggiornare il loro stato se non li unisci nuovamente. Questo è più un problema per l'API ORM di SQLAlchemy, che non sembra essere stata utilizzata finora.
  3. Le tue modifiche non sono state confermate. Dici che lo sono, supponiamo che non sia così, ma se nessuna delle altre vie lo spiega potresti voler guardare di nuovo.

Un generale suggerimento di debug: se volete sapere esattamente cosa sta facendo SQLAlchemy nel database, passare echo=True alla funzione create_engine. Il motore stamperà tutte le query che esegue.

Anche check out this suggestion Ho fatto a qualcun altro, che stava usando ORM e aveva problemi di transazione, che ha risolto il problema senza mai individuarlo. Forse ti aiuterà.

9

La chiamata session.expire_all() eliminerà tutti i dati caricati dal database dalla sessione. Qualsiasi accesso degli attributi dell'oggetto successivo emette una nuova istruzione SELECT e recupera nuovi dati. Si prega di vedere http://docs.sqlalchemy.org/en/latest/orm/session_state_management.html#refreshing-expiring per lo sfondo.

Se viene ancora visualizzato il cosiddetto "caching" dopo aver chiamato expire_all(), è necessario chiudere le transazioni come descritto nel collegamento answer collegato in precedenza.

Problemi correlati