diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2008-01-25 18:16:12 +0000 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2008-01-25 18:16:12 +0000 |
| commit | 33a6724e33140861fbd66de61875797408a1e02e (patch) | |
| tree | 78d22dae3d3b989a58fb8268f0c45088114eca54 /lib/sqlalchemy | |
| parent | fadc61e8ca03358fcbb72a9e9446ab7018e295ea (diff) | |
| download | sqlalchemy-33a6724e33140861fbd66de61875797408a1e02e.tar.gz | |
- added standalone "query" class attribute generated
by a scoped_session. This provides MyClass.query
without using Session.mapper. Use via:
MyClass.query = Session.query_property()
Diffstat (limited to 'lib/sqlalchemy')
| -rw-r--r-- | lib/sqlalchemy/orm/mapper.py | 7 | ||||
| -rw-r--r-- | lib/sqlalchemy/orm/scoping.py | 26 |
2 files changed, 30 insertions, 3 deletions
diff --git a/lib/sqlalchemy/orm/mapper.py b/lib/sqlalchemy/orm/mapper.py index 07075efd0..d9dc70a58 100644 --- a/lib/sqlalchemy/orm/mapper.py +++ b/lib/sqlalchemy/orm/mapper.py @@ -1578,7 +1578,7 @@ def object_mapper(object, entity_name=None, raiseerror=True): return None return mapper -def class_mapper(class_, entity_name=None, compile=True): +def class_mapper(class_, entity_name=None, compile=True, raiseerror=True): """Given a class and optional entity_name, return the primary Mapper associated with the key. If no mapper can be located, raises ``InvalidRequestError``. @@ -1587,7 +1587,10 @@ def class_mapper(class_, entity_name=None, compile=True): try: mapper = class_._class_state.mappers[entity_name] except (KeyError, AttributeError): - raise exceptions.InvalidRequestError("Class '%s' entity name '%s' has no mapper associated with it" % (class_.__name__, entity_name)) + if raiseerror: + raise exceptions.InvalidRequestError("Class '%s' entity name '%s' has no mapper associated with it" % (class_.__name__, entity_name)) + else: + return None if compile: return mapper.compile() else: diff --git a/lib/sqlalchemy/orm/scoping.py b/lib/sqlalchemy/orm/scoping.py index 19cd44884..479b2f737 100644 --- a/lib/sqlalchemy/orm/scoping.py +++ b/lib/sqlalchemy/orm/scoping.py @@ -1,5 +1,5 @@ from sqlalchemy.util import ScopedRegistry, to_list, get_cls_kwargs -from sqlalchemy.orm import MapperExtension, EXT_CONTINUE, object_session +from sqlalchemy.orm import MapperExtension, EXT_CONTINUE, object_session, class_mapper from sqlalchemy.orm.session import Session from sqlalchemy import exceptions import types @@ -69,6 +69,30 @@ class ScopedSession(object): self.session_factory.configure(**kwargs) + def query_property(self): + """return a class property which produces a `Query` object against the + class when called. + + e.g.:: + Session = scoped_session(sessionmaker()) + + class MyClass(object): + query = Session.query_property() + + # after mappers are defined + result = MyClass.query.filter(MyClass.name=='foo').all() + + """ + + class query(object): + def __get__(s, instance, owner): + mapper = class_mapper(owner, raiseerror=False) + if mapper: + return self.registry().query(mapper) + else: + return None + return query() + def instrument(name): def do(self, *args, **kwargs): return getattr(self.registry(), name)(*args, **kwargs) |
