Hi everyone, For my last few projects, I've been using slightly modified setup in my project/model/{__init__,meta}.py and I would like for you to consider it for the default package template.
I pasted the diff at the end of the message, but here is a rough summary: Instead of instantiating Session to None in meta.py, I instantiate it as a scoped_session object without a bound engine. Then, in __init__py, the same init method will bind the Session object to an engine. This has a couple of benefits in that it lets you import the Session object prematurely (ie. from +project+.model.meta import Session) and it will still work (assuming that the init_model method is called before actually using the model). Unlike the current Pylons default template where importing too early will cause you to have Session == None. This is particularly convenient when writing unit tests. It lets you do the import normally at the top of the unit test file as you normally would, instead of having to do bizarre wrapping in the setUp methods. I have not been able to find any downsides to doing this. No unit tests are broken because of this as far as I can tell (although 8 unit tests fail from the hg tip for me to begin with). The diff below contains these changes, it also contains a note about SQLAlchemy 0.5+ which deprecates the (autoflush=True, transactional=True) parameters in the sessionmaker constructor. I hope this is helpful! Thanks for all your great work, Andrey Here's pylons-better-sqlalchemy-model-template.diff against hg tip: =========== start =========== diff -r b98fbafd85c5 pylons/templates/default_project/+package+/model/ __init__.py_tmpl --- a/pylons/templates/default_project/+package+/model/ __init__.py_tmpl Wed Jan 07 20:56:58 2009 -0800 +++ b/pylons/templates/default_project/+package+/model/ __init__.py_tmpl Sat Jan 10 13:09:25 2009 -0500 @@ -13,10 +13,8 @@ # autoload_with=engine) #orm.mapper(Reflected, reflected_table) # - sm = orm.sessionmaker(autoflush=True, transactional=True, bind=engine) - meta.engine = engine - meta.Session = orm.scoped_session (sm) + meta.Session.configure (bind=engine) ## Non-reflected tables may be defined and mapped at module level diff -r b98fbafd85c5 pylons/templates/default_project/+package+/model/ meta.py_tmpl --- a/pylons/templates/default_project/+package+/model/ meta.py_tmpl Wed Jan 07 20:56:58 2009 -0800 +++ b/pylons/templates/default_project/+package+/model/ meta.py_tmpl Sat Jan 10 13:09:25 2009 -0500 @@ -1,6 +1,7 @@ {{if sqlalchemy}} """SQLAlchemy Metadata and Session object""" from sqlalchemy import MetaData +from sqlalchemy.orm import scoped_session, sessionmaker __all__ = ['Session', 'metadata'] @@ -8,7 +9,8 @@ engine = None # SQLAlchemy session manager. Updated by model.init_model() -Session = None +# For SQLAlchemy 0.5+ replace the sessionmaker parameters with autocommit=True +Session = scoped_session(sessionmaker(autoflush=True, transactional=True)) # Global metadata. If you have multiple databases with overlapping table # names, you'll need a metadata for each database =========== end =========== --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "pylons-devel" group. To post to this group, send email to pylons-devel@googlegroups.com To unsubscribe from this group, send email to pylons-devel+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/pylons-devel?hl=en -~----------~----~----~----~------~----~------~--~---