2011-11-24 14 views
34

Por varias razones, estoy tratando de obtener una colección de objetos de una base de datos y pasarla a otro proceso que no está conectado a la base de datos. Mi código es similar a la de abajo, pero me siguen dandoSQLAlchemy, obtener objeto no vinculado a una sesión

sqlalchemy.exc.UnboundExecutionError: Instance <MyClass at 0x8db7fec> is not bound to a Session; attribute refresh operation cannot proceed 

Cuando trato de mirar a los elementos de mi lista fuera del método get_list().

def get_list (obj): 
    sesson = Session() 
    lst = session.query(MyClass).all() 
    session.close() 
    return lst 

Sin embargo, si utilizo este

def get_list_bis (obj) 
    session = Session() 
    return session.query(MyClass).all() 

Soy capaz de utilizar los elementos de preocuparse por el estado de la sesión, ya que no estaba cerrada.

¿Qué me falta aquí?

Respuesta

39

Si desea que un conjunto de objetos producidos mediante la consulta de una sesión sean utilizables fuera del alcance de la sesión, necesita expunge para la sesión.

En el primer ejemplo de función, tendrá que añadir una línea:

session.expunge_all() 

antes

session.close() 

De manera más general, digamos que la sesión no se cierra de inmediato, al igual que en la primera ejemplo. Quizás esta es una sesión que se mantiene activa durante toda la duración de una solicitud web o algo así. En tales casos, no desea hacer expunge_all. Usted tendrá que ser más quirúrgica:

for item in lst: 
    session.expunge(item) 
+17

Pero ... pero ... "El método close() emite un expunge_all() y libera cualquier recurso transaccional/de conexión." Esta declaración se encuentra en la página a la que se hace referencia, al menos hasta la versión 0.6. – Oddthinking

1

En mi caso, yo estaba ahorrando una entidad relacionada, así, y esta receta me ayudó a refresh todas las instancias dentro de una sesión, aprovechando el hecho de que la sesión es iterable:

map(session.refresh, iter(session)) # call refresh() on every instance 

Esto es extremadamente ineficaz, pero funciona. Debería estar bien para pruebas unitarias.

Nota final: en Python3 map() es un generador y no hará nada. Use bucles reales de listas de comprensión

+4

En cualquier caso, no debe usar 'map' si no le importa el resultado. – ThiefMaster

Cuestiones relacionadas