works fully for all embedded selectables.
- orm
+ - 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()
+
- The proper error message is raised when trying to access
expired instance attributes with no session present
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``.
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:
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
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)
def test_basic(self):
Session = scoped_session(sessionmaker())
- class SomeObject(fixtures.Base):pass
- class SomeOtherObject(fixtures.Base):pass
+ class SomeObject(fixtures.Base):
+ query = Session.query_property()
+ class SomeOtherObject(fixtures.Base):
+ query = Session.query_property()
mapper(SomeObject, table, properties={
'options':relation(SomeOtherObject)
Session.commit()
Session.remove()
- assert SomeObject(id=1, data="hello", options=[SomeOtherObject(someid=1)]) == Session.query(SomeObject).one()
-
+ self.assertEquals(SomeObject(id=1, data="hello", options=[SomeOtherObject(someid=1)]), Session.query(SomeObject).one())
+ self.assertEquals(SomeObject(id=1, data="hello", options=[SomeOtherObject(someid=1)]), SomeObject.query.one())
+ self.assertEquals(SomeOtherObject(someid=1), SomeOtherObject.query.filter(SomeOtherObject.someid==sso.someid).one())
class ScopedMapperTest(PersistTest):
def setUpAll(self):