Bob Farrell wrote:
>
> Hi Michael, I found this (your writing) in a thread from quite a while
> back:
>
>> A common pattern which can cause what you see there is if your
>> templates are accessing lazy loaders on objects, but the Session which
>> loaded those objects had been clear()'ed or otherwise closed before
>> the template was allowed to render.  You should try to keep the same
>> Session open throughout the full request lifecycle, and you should
>> avoid removing any objects from the Session which you wish to continue
>> using.
>>
> Hi - came across this because I've started getting the same problem
> and was somewhat relieved to see that the solution is a well-known one
> (given that rendering the template raises this error). I have code
> like this:
>
>         [do stuff involving the session]
>         return self.render_response('settings.mako', t_pars)
>
> in my controller methods and it's the return where the error gets
> raised. Can you tell me a good approach for making the session stay
> alive here ? I'm assuming the problem is that self.render_response
> returns something lazy and so by the time the template actually
> renders the objects relating to the session have gone out of scope.

the whole request is wrapped within a block that handles Session
lifecycle, so that the Session is still just fine when render_response is
being called.  In Pylons, an appropriate base.py is provided for you which
does this.    A description is at
http://www.sqlalchemy.org/docs/05/session.html#lifespan-of-a-contextual-session
.

The Session has a behavior whereby after a commit(), it expires its
contents.  This so that it reloads everything upon access to get access to
what any concurrent transactions have done.   If your pattern is something
like this:

   Session.commit()
   return self.render_response(...)


your render phase may issue a lot of SQL to reload things (though nothing
should break).    Two ways to work around this are to set
expire_on_commit=False in your sessionmaker(), or to wrap your whole
controller method in a commit, such as:

@commits_transaction
def my_method(self):
    <do stuff>
    return self.render_response(...)

commits_transaction looks like:

@decorator
def commits_transaction(fn, self, *args, **kw):
    try:
        ret = fn(self, *args, **kw)
        Session.commit()
        return ret
    except:
        Session.rollback()
        raise

the rollback() may not be needed if your overall handler calls rollback()
in all cases.


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to