summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/orm/sessionmaker.py
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2007-08-01 20:52:26 +0000
committerMike Bayer <mike_mp@zzzcomputing.com>2007-08-01 20:52:26 +0000
commitf75faa7cb489a343a2f26afd32c42a378591d6ad (patch)
tree231d0fa98f7aea1ac7d80c87e674ecb896fe79aa /lib/sqlalchemy/orm/sessionmaker.py
parent8a5d576872e7e16a419b08770a6000a6a8001ef7 (diff)
downloadsqlalchemy-f75faa7cb489a343a2f26afd32c42a378591d6ad.tar.gz
- SessionContext and assignmapper are deprecated
- Session function is removed - all replaced with new sessionmaker() function. description at: http://www.sqlalchemy.org/trac/wiki/WhatsNewIn04#create_sessionSessionContextassignmapperDeprecated
Diffstat (limited to 'lib/sqlalchemy/orm/sessionmaker.py')
-rw-r--r--lib/sqlalchemy/orm/sessionmaker.py94
1 files changed, 94 insertions, 0 deletions
diff --git a/lib/sqlalchemy/orm/sessionmaker.py b/lib/sqlalchemy/orm/sessionmaker.py
new file mode 100644
index 000000000..42064c5b8
--- /dev/null
+++ b/lib/sqlalchemy/orm/sessionmaker.py
@@ -0,0 +1,94 @@
+import types
+
+from sqlalchemy import util, exceptions
+from sqlalchemy.orm.session import Session
+from sqlalchemy.orm import query, util as mapperutil, MapperExtension, EXT_CONTINUE
+from sqlalchemy.orm.mapper import global_extensions
+
+def sessionmaker(autoflush, transactional, bind=None, scope=None, enhance_classes=False, **kwargs):
+ """Generate a Session configuration."""
+
+ if enhance_classes and scope is None:
+ raise exceptions.InvalidRequestError("enhance_classes requires a non-None 'scope' argument, so that mappers can automatically locate a Session already in progress.")
+
+ class Sess(Session):
+ def __init__(self, **local_kwargs):
+ local_kwargs.setdefault('bind', bind)
+ local_kwargs.setdefault('autoflush', autoflush)
+ local_kwargs.setdefault('transactional', transactional)
+ for k in kwargs:
+ local_kwargs.setdefault(k, kwargs[k])
+ super(Sess, self).__init__(**local_kwargs)
+
+ if scope=="thread":
+ registry = util.ScopedRegistry(Sess, scopefunc=None)
+
+ if enhance_classes:
+ class SessionContextExt(MapperExtension):
+ def get_session(self):
+ return 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_)
+
+ if not hasattr(class_, 'query'):
+ class_.query = query()
+
+ def init_instance(self, mapper, class_, oldinit, instance, args, kwargs):
+ session = kwargs.pop('_sa_session', 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)
+ setattr(instance, key, value)
+ session._save_impl(instance, entity_name=kwargs.pop('_sa_entity_name', None))
+ return EXT_CONTINUE
+
+ def init_failed(self, mapper, class_, oldinit, instance, args, kwargs):
+ object_session(instance).expunge(instance)
+ return EXT_CONTINUE
+
+ def dispose_class(self, mapper, class_):
+ if hasattr(class_, '__init__') and hasattr(class_.__init__, '_oldinit'):
+ if class_.__init__._oldinit is not None:
+ class_.__init__ = class_.__init__._oldinit
+ else:
+ delattr(class_, '__init__')
+ if hasattr(class_, 'query'):
+ delattr(class_, 'query')
+
+ global_extensions.append(SessionContextExt())
+
+ default_scope=scope
+ class ScopedSess(Sess):
+ def __new__(cls, **kwargs):
+ if len(kwargs):
+ scope = kwargs.pop('scope', default_scope)
+ if scope is not None:
+ if registry.has():
+ raise exceptions.InvalidRequestError("Scoped session is already present; no new arguments may be specified.")
+ else:
+ sess = Sess(**kwargs)
+ registry.set(sess)
+ return sess
+ else:
+ return Sess(**kwargs)
+ else:
+ return registry()
+ def instrument(name):
+ def do(cls, *args, **kwargs):
+ return getattr(registry(), name)(*args, **kwargs)
+ return classmethod(do)
+ for meth in ('get', 'close', 'save', 'commit', 'update', 'flush', 'query', 'delete'):
+ setattr(ScopedSess, meth, instrument(meth))
+
+ return ScopedSess
+ elif scope is not None:
+ raise exceptions.ArgumentError("Unknown scope '%s'" % scope)
+ else:
+ return Sess