On Tue, Jun 17, 2008 at 05:25:56PM +0200, Brian Sutherland wrote:
class IDatabase(Interface): def scopefunc(): """The scopefunc"""
def session_factory(): """The session factory"""
def scopefunc(): util = component.getUtility(IDatabase) return util.scopefunc()
This will allow you to implement a global IDatabase utility that's global and uses a thread-local scope only. Similarly, we can delegate session creation to the IDatabase utility completely:
def session_factory(): util = component.getUtility(IDatabase) return util.session_factory()
I think you missed the final piece:
Session = scoped_session(session_factory, scopefunc=scopefunc)
I think that's better than what I have now, as you can then completely control session creation through a utility.
Yep
It doesn't add a new plugin point or utility lookup, but allows you to implement your use case, right? We'll just need to implement a number of utilities that fulfill the various use cases.
Yes, it looks pretty trivial to plug in a normal sqlalchemy session.
This would probably be close to what I would write for my usecase: class Database: implements(IDatabase) def __init__(self, *args, **kw): self._args = args self._kw = kw def scopefunc(self): return None # use default per-thread scoping def session_factory(self): return sessionmaker(*self._args, **self._kw) -- Brian Sutherland