Search code examples
pythonsqlalchemy

SQLAlchemy, get object not bound to a Session


I am trying to get an collection of objects out of a database and pass it to another process that is not connected to the database. My code looks like the one below but I keep getting:

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

When I try to look at the elements of my list outside of the get_list() method.

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

However, if I use this:

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

I am able to use the elements but worry about the state of the session since it was not closed.

What am I missing here?


Solution

  • If you want a bunch of objects produced by querying a session to be usable outside the scope of the session, you need to expunge them for the session.

    In your first function example, you will need to add a line:

    session.expunge_all()
    

    before

    session.close()
    

    More generally, let's say the session is not closed right away, like in the first example. Perhaps this is a session that is kept active during entire duration of a web request or something like that. In such cases, you don't want to do expunge_all. You will want to be more surgical:

    for item in lst:
        session.expunge(item)