2012-08-24 15 views
5

Tengo un problema con SQL Alchemy: mi aplicación funciona como una aplicación de Python en constante funcionamiento.Cómo evitar el almacenamiento en caché en sqlalchemy?

que tienen función como esta:

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} 

creo que esto es claro ejemplo - un conjunto de resultados se obtiene de la base de datos, el segundo simplemente se pasa como argumento.

El problema es que cuando cambio datos en mi base de datos, esta función aún devuelve datos como si nada hubiera cambiado. Cuando cambio los datos en el parámetro de entrada, el parámetro devuelto "cálculo" tiene el valor adecuado.

Cuando reinicio el servidor de aplicaciones, la situación vuelve a la normalidad: los datos nuevos se obtienen de MySQL.

sé que hubo varias preguntas sobre SQLAlchemy almacenamiento en caché como:

How to disable caching correctly in Sqlalchemy orm session?

How to disable SQLAlchemy caching?

pero cómo otras puedo llamar esta situación? Parece que SQLAlchemy mantiene los datos obtenidos antes y no realiza nuevas consultas hasta que la aplicación se reinicie. ¿Cómo puedo evitar tal comportamiento?

+0

¿Cómo está cambiando los datos en la base de datos? ¿Eso está cambiado? – icecrime

+0

Lo cambio a mano. El motor de base de datos es MySQL. Sí, el cambio está comprometido. – Archarius

+0

http://stackoverflow.com/a/15788051/497208 puede ser útil –

Respuesta

1

Algunas posibilidades.

  1. Está reutilizando su session incorrectamente o en un momento inadecuado. La mejor práctica es tirar su session después de comprometerse, y obtener uno nuevo en el último momento posible antes de usarlo. El comportamiento que parece ser el almacenamiento en caché puede de hecho ser debido a una vida útil de session que es muy larga en su aplicación.
  2. Los objetos que sobreviven más tiempo que el session no se combinan en un session posterior. Es posible que los "metadatos" no puedan actualizar su estado si no los fusiona nuevamente. Esto es más una preocupación para la API ORM de SQLAlchemy, que no parece que vaya a utilizar hasta ahora.
  3. Sus cambios no se han confirmado. Usted dice que son así, asumiremos que no es así, pero si ninguna de las otras vías lo explica, es posible que desee volver a mirar.

Un consejo general de depuración: si usted quiere saber exactamente lo que está haciendo SQLAlchemy en la base de datos, pase a la función echo=Truecreate_engine. El motor imprimirá todas las consultas que ejecuta.

También check out this suggestion He hecho a otra persona, que estaba usando ORM y tenía problemas de transaccionalidad, lo que resolvió su problema sin siquiera localizarlo. Tal vez te ayude.

9

La llamada a session.expire_all() desalojará todos los datos cargados en la base de datos de la sesión. Cualquier acceso posterior a los atributos del objeto emite una nueva instrucción SELECT y recupera los datos nuevos. Por favor, consulte http://docs.sqlalchemy.org/en/latest/orm/session_state_management.html#refreshing-expiring para el fondo.

Si aún ve el llamado "almacenamiento en caché" después de llamar a expire_all(), entonces debe cerrar las transacciones como se describe en mi answer vinculado anteriormente.

Cuestiones relacionadas