Now the decorator swallows exceptions silently. You have to reraise
the exception after rolling back like Michael did. I believe the
correct form is:
def transaction(f):
def wrapper(*args, **kwargs):
try:
value = f(*args, **kwargs)
except:
session.rollback()
raise
else:
session.commit()
return value
return wrapper
On Wed, Apr 8, 2009 at 7:12 AM, Diez B. Roggisch <[email protected]> wrote:
>
> On Wednesday 08 April 2009 05:53:12 Michael Bayer wrote:
>> On Apr 7, 2009, at 6:07 PM, [email protected] wrote:
>> > Hey Everyone,
>> >
>> > I'm new to SQLAlchemy (used to using Django's ORM but need to switch)
>> > and there's just one thing I'm struggling with, which is when am I
>> > supposed to create Sessions? I am of course creating "scoped
>> > sessions". I feel like a real dunce for not being able to get my head
>> > around it.
>> >
>> > Do I create one per-request and pass it around? That just doesn't feel
>> > quite right to me. Or can I create them at module-level when I need
>> > them?
>>
>> per-request is the most natural approach. The point of the
>> "scopedsession" is that you can use it as a "global" object, there's
>> no need to pass it around. It automatically routes operations to a
>> thread-local session. I'm sure django does something similar. the
>> chapter on sessions includes a discussion on integrating scopedsession
>> within a web application, you should check it out.
>>
>> > Also, is it okay to call commit() more than once on the same
>> > session?
>>
>> absolutely.
>>
>> > On a per-function basis even (seems like an awful lot of
>> > boilerplate code in each function though… surely not?!)
>>
>> depending on what you're doing , this may or may not be appropriate.
>> boilerplate can be cut down using a decorator, such as:
>>
>> @commits
>> def do_some_stuff(...):
>> ....
>>
>> the decorator:
>>
>> def commits(fn):
>> def go(*args, **kw):
>> try:
>> return fn(*args, **kw)
>> Session.commit()
>
> Not to be to nitpicky... but this commit is never reached. And dangling
> transactions can be very irritating.
>
>
> I'd go for this (untetsted)
>
> def transaction(f)
> def _wrapper(*args, **kwargs):
> commit = True
> try:
> return f(*args, **kwargs)
> except:
> commit = False
> finally:
> (session.commit if commit else session.rollback)()
>
>
> Diez
>
> >
>
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---