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 <de...@web.de> wrote:
>
> On Wednesday 08 April 2009 05:53:12 Michael Bayer wrote:
>> On Apr 7, 2009, at 6:07 PM, rintin...@googlemail.com 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 sqlalchemy@googlegroups.com
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to