2010-11-23 9 views
8

Tengo un pequeño servidor de ahorro en python que utilizo para realizar búsquedas rápidas. El servidor consulta mysql a través de SqlAlchemy en la primera solicitud y coloca todos los objetos devueltos en un diccionario, por lo que en solicitudes posteriores no se necesita una llamada a DB. Acabo de obtener el objeto del dict y luego llamo a algunos de los métodos de objeto necesarios para dar la respuesta adecuada.Problema con SqlAlchemy: "La instancia principal <SomeClass> no está vinculada a una sesión; operación de carga lenta ..."

Inicialmente, todo está bien. Sin embargo, después de que el servidor se queda un rato, me estoy haciendo esta excepción cuando se accede a los métodos del objeto SQLAlchemy:

instancia principal no está vinculado a una sesión; La operación de carga lenta del atributo 'tasa' no puede continuar.

extraño, porque puse eagerload('rate').

Realmente no veo un patrón en este comportamiento, solo afecta a algunos objetos. Sin embargo, una vez que afecta un objeto continuará haciéndolo en cada solicitud hasta que reinicie mi servidor python.

¿Alguna idea?

+0

Acabo de notar en una de las llamadas a la propiedad de 'tasa' ansiosa, estoy usando una ruta de búsqueda diferente a la que estaba ansiosa, así que la he modificado y veré si hace una diferencia. – Tony

+0

hizo la diferencia? –

+1

¿Cómo se define la tasa? ¿Es una relación sa.orm.? Tal vez publicar un código de ejemplo. –

Respuesta

7

Probablemente guarda en caché los objetos entre las solicitudes, y cuando se produce la confirmación, se borra el objeto de sesión, invalidando sus objetos. Si inicia su servidor a través de un servidor web multiproceso que inicia a los trabajadores según sea necesario, eso explica por qué no hay un patrón. Si usted no desea conseguir el fondo de esto y sólo necesitan una solución rápida, esto siempre funciona:

if obj not in session: 
    obj = session.query(ObjClass).get(obj.id) 

La solución adecuada sería hacer seguro de que no entre objetos de caché peticiones.

+0

Sí. En mi caso, fue el hecho de que una tarea de apio se llamó sincrónicamente y el hecho de que pasa el objeto como un parámetro en lugar de un tipo primitivo. Apio se estaba ejecutando en un entorno de aplicación diferente y la sesión confundió el SQLAlchemy con el alcance de la sesión. Para solucionarlo, simplemente '.delay()' la llamada y pasar parámetros por valor primitivo. – Devy

Cuestiones relacionadas