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

Reply via email to