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
-~----------~----~----~----~------~----~------~--~---