summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2007-08-03 19:31:38 +0000
committerMike Bayer <mike_mp@zzzcomputing.com>2007-08-03 19:31:38 +0000
commite7c83bb37133af7b0deaef2fbc0d0fae8a179dfc (patch)
treeb4aec5209e546128ace3719f874be05950027abe /lib/sqlalchemy
parentfdc58f4141b094f06f87416def9edffa59ab17d9 (diff)
downloadsqlalchemy-e7c83bb37133af7b0deaef2fbc0d0fae8a179dfc.tar.gz
- removed enhance_classes from scoped_session, replaced with
scoped_session(...).mapper. 'mapper' essentially does the same thing as assign_mapper less verbosely. - adapted assignmapper unit tests into scoped_session tests
Diffstat (limited to 'lib/sqlalchemy')
-rw-r--r--lib/sqlalchemy/orm/scoping.py54
1 files changed, 38 insertions, 16 deletions
diff --git a/lib/sqlalchemy/orm/scoping.py b/lib/sqlalchemy/orm/scoping.py
index 96d9a23fc..5d11a99a4 100644
--- a/lib/sqlalchemy/orm/scoping.py
+++ b/lib/sqlalchemy/orm/scoping.py
@@ -1,4 +1,4 @@
-from sqlalchemy.util import ScopedRegistry, warn_deprecated
+from sqlalchemy.util import ScopedRegistry, warn_deprecated, to_list
from sqlalchemy.orm import MapperExtension, EXT_CONTINUE
from sqlalchemy.orm.session import Session
from sqlalchemy.orm.mapper import global_extensions
@@ -13,16 +13,21 @@ class ScopedSession(object):
Usage::
- Session = scoped_session(sessionmaker(autoflush=True), enhance_classes=True)
+ Session = scoped_session(sessionmaker(autoflush=True))
+
+ To map classes so that new instances are saved in the current
+ Session automatically, as well as to provide session-aware
+ class attributes such as "query":
+
+ mapper = Session.mapper
+ mapper(Class, table, ...)
"""
- def __init__(self, session_factory, scopefunc=None, enhance_classes=False):
+ def __init__(self, session_factory, scopefunc=None):
self.session_factory = session_factory
- self.enhance_classes = enhance_classes
self.registry = ScopedRegistry(session_factory, scopefunc)
- if self.enhance_classes:
- global_extensions.append(_ScopedExt(self))
+ self.extension = _ScopedExt(self)
def __call__(self, **kwargs):
if kwargs:
@@ -39,15 +44,28 @@ class ScopedSession(object):
else:
return self.registry()
+ def mapper(self, *args, **kwargs):
+ """return a mapper() function which associates this ScopedSession with the Mapper."""
+
+ from sqlalchemy.orm import mapper
+ validate = kwargs.pop('validate', False)
+ extension = to_list(kwargs.setdefault('extension', []))
+ if validate:
+ extension.append(self.extension.validating())
+ else:
+ extension.append(self.extension)
+ return mapper(*args, **kwargs)
+
def configure(self, **kwargs):
- """reconfigure the sessionmaker used by this SessionContext"""
+ """reconfigure the sessionmaker used by this ScopedSession."""
+
self.session_factory.configure(**kwargs)
def instrument(name):
def do(self, *args, **kwargs):
return getattr(self.registry(), name)(*args, **kwargs)
return do
-for meth in ('get', 'close', 'save', 'commit', 'update', 'flush', 'query', 'delete'):
+for meth in ('get', 'close', 'save', 'commit', 'update', 'flush', 'query', 'delete', 'clear'):
setattr(ScopedSession, meth, instrument(meth))
def makeprop(name):
@@ -67,18 +85,22 @@ for prop in ('close_all',):
setattr(ScopedSession, prop, clslevel(prop))
class _ScopedExt(MapperExtension):
- def __init__(self, context):
+ def __init__(self, context, validate=False):
self.context = context
+ self.validate = validate
+
+ def validating(self):
+ return _ScopedExt(self.context, validate=True)
def get_session(self):
return self.context.registry()
def instrument_class(self, mapper, class_):
class query(object):
- def __getattr__(self, key):
- return getattr(registry().query(class_), key)
- def __call__(self):
- return registry().query(class_)
+ def __getattr__(s, key):
+ return getattr(self.context.registry().query(class_), key)
+ def __call__(s):
+ return self.context.registry().query(class_)
if not hasattr(class_, 'query'):
class_.query = query()
@@ -87,9 +109,9 @@ class _ScopedExt(MapperExtension):
session = kwargs.pop('_sa_session', self.context.registry())
if not isinstance(oldinit, types.MethodType):
for key, value in kwargs.items():
- #if validate:
- # if not self.mapper.get_property(key, resolve_synonyms=False, raiseerr=False):
- # raise exceptions.ArgumentError("Invalid __init__ argument: '%s'" % key)
+ if self.validate:
+ if not mapper.get_property(key, resolve_synonyms=False, raiseerr=False):
+ raise exceptions.ArgumentError("Invalid __init__ argument: '%s'" % key)
setattr(instance, key, value)
session._save_impl(instance, entity_name=kwargs.pop('_sa_entity_name', None))
return EXT_CONTINUE