Hi All,

One of the things that doesn't seem to be covered in the docs, and that I'm 
currently trying to figure out, is the recommended design pattern to use for 
managing sessions from declarative methods calls.

Consider a declarative class "User", where I want to implement a "FindFriends() 
method:

class User(Base):
        # declarative fields defined here
        
        def FindFriends(self):
                session = Session()
                # it's handy to use the "self" reference in query methods:
                friends = session.query(Friends).filter_by(friend=self).all()
                session.close()
                return friends

Certainly, these types of methods would seem to be useful, but here's a dilemma 
- the above code doesn't work. Because the method uses a new session, which is 
guaranteed to not be the same session that was used to retrieve the original 
User object, the following code will fail:

session = session()
me = session.query(User).filter_by(name="Daniel").first()
me.FindFriends()

It would seem to be handy if SQLAlchemy placed a reference in each declarative 
object of the session from which it originated when query was called, so then 
my code could do something like this:

class User(Base):
        # declarative fields defined here

        def FindFriends(self):
                # note the "self.session.query" - the idea is that sqlalchemy's 
query() would initialize this for us
                return self.session.query(Friends).filter_by(friend=self).all()

Then this would allow the following code to work:

session = session()
me = session.query(User).filter_by(name="Daniel").first()
me.FindFriends()

This would work because me.FindFriends() would now have easy access to the same 
session that was used to retrieve "me" -- so the objects would be "compatible" 
and could be easily combined in queries. This would allow many methods to be 
added to the User class that could all do various kinds of db queries without 
having to pass a session variable around manually.

My question is - what is the recommended design pattern to do what I am trying 
to do above? Passing the current session as an argument to FindFriends() seems 
cumbersome - is that the recommended approach or is there a more elegant way to 
handle it? Is my "handy" suggestion above something that would actually be 
useful or is there a better way to do what I am wanting to do?

(I'm trying to be a good SQLAlchemy coder and not use a global 
session=Session() for everything, as explained here: 
http://www.sqlalchemy.org/docs/session.html#frequently-asked-questions . But to 
do this, I need to find a good design pattern to use in place of a global :)

Thanks and Regards,

Daniel

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalch...@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