diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2007-08-01 20:52:26 +0000 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2007-08-01 20:52:26 +0000 |
commit | f75faa7cb489a343a2f26afd32c42a378591d6ad (patch) | |
tree | 231d0fa98f7aea1ac7d80c87e674ecb896fe79aa /lib/sqlalchemy/orm/sessionmaker.py | |
parent | 8a5d576872e7e16a419b08770a6000a6a8001ef7 (diff) | |
download | sqlalchemy-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.py | 94 |
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 |