On Mar 28, 7:12 pm, Michael Bayer <[email protected]> wrote:
> On Mar 28, 2010, at 10:26 AM, Peteris Krumins wrote:
>
>
>
> > Hi all,
>
> > Can anyone explain to me how to correctly create sessions in web
> > applications?
>
> > The documentation gives an example with a scoped_session:
>
> >    from sqlalchemy.orm import scoped_session, sessionmaker
> >    Session = scoped_session(sessionmaker())
>
> > Okay, I should wrap the "thing" returned by sessionmaker() in
> > scoped_session(). But do I later still have to construct Session() by
> > doing this:
>
> >    session = Session()
>
> > I did some experiments and I don't get it.
>
> > Here is the code I tried:
>
> >>>> from app.models import Page
>
> >>>> Session = sessionmaker(bind=engine, autoflush=True,
> > autocommit=False)
> >>>> session = scoped_session(Session)
>
> >>>> session
> >    <sqlalchemy.orm.scoping.ScopedSession object at 0x848eb8c>
> >>>> session()
> >    <sqlalchemy.orm.session.Session object at 0x83fe08c>
> >>>> session.query(Page).count()
> >    211L
> >>>> session().query(Page).count()
> >    211L
>
> > Both work identically, but I don't understand the difference. Can
> > anyone explain it please?
>
> > Also when do I have to call remove() method that is mentioned in
> > documentation?
>
> ScopedSession is a class that implements __call__().    An instance of 
> ScopedSession then maintains a reference to a thread local object, which in 
> turn references individual Session objects.   So if "ss" is a ScopedSession 
> instance, calling ss() (i.e. its __call__() method) returns the current 
> thread's Session.   In this way ScopedSession mimics a "constructor", and an 
> existing application which says "sess = Session(); sess.query(Foo)" can 
> transparently be made to use a thread-scoped session by changing the meaning 
> of the identifier "Session".
>
> The second part of the story is that people found it tedious to say sess = 
> Session(); sess.query(Foo) all the time to perform an operation on the 
> current thread's session, so a __getattr__()-like scheme was added  which 
> compresses those two steps into one, meaning 
> <some_scoped_session>.<some_Session_method>() equates to "sess = Session(); 
> return sess.<some_Session_method>()".  But what this also means is, like the 
> case of __call__(), an application which currently uses a single global 
> Session to do everything, i.e. "session.query(Foo)" throughout, can also 
> transparently be made to use a thread-scoped session by changing the meaning 
> of the identifier "session".
>
>
>
> > Thanks,
> > Peteris Krumins
>
> > --
> > 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 
> > athttp://groups.google.com/group/sqlalchemy?hl=en.

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