""":class:`MapperProperty` which proxies access to a
user-defined descriptor."""
- def set_parent(self, parent, init):
- if self.descriptor is None:
- desc = getattr(parent.class_, self.key, None)
- if parent._is_userland_descriptor(desc):
- self.descriptor = desc
- self.parent = parent
-
def instrument_class(self, mapper):
- class_ = self.parent.class_
-
from sqlalchemy.ext import hybrid
# hackety hack hack
def __init__(self, key):
self.key = key
+ if self.descriptor is None:
+ desc = getattr(mapper.class_, self.key, None)
+ if mapper._is_userland_descriptor(desc):
+ self.descriptor = desc
+
if self.descriptor is None:
def fset(obj, value):
setattr(obj, self.name, value)
util.set_creation_order(self)
def _comparator_factory(self, mapper):
- class_ = self.parent.class_
- prop = getattr(class_, self.name).property
+ prop = getattr(mapper.class_, self.name).property
if self.comparator_factory:
comp = self.comparator_factory(prop, mapper)
return comp
def set_parent(self, parent, init):
- if self.descriptor is None:
- desc = getattr(parent.class_, self.key, None)
- if parent._is_userland_descriptor(desc):
- self.descriptor = desc
if self.map_column:
if self.key not in parent.mapped_table.c:
raise sa_exc.ArgumentError(
class ComparableProperty(DescriptorProperty):
"""Instruments a Python property for use in query expressions."""
- extension = None
-
def __init__(self, comparator_factory, descriptor=None, doc=None):
self.descriptor = descriptor
self.comparator_factory = comparator_factory
self.doc = doc or (descriptor and descriptor.__doc__) or None
util.set_creation_order(self)
- def set_parent(self, parent, init):
- if self.descriptor is None:
- desc = getattr(parent.class_, self.key, None)
- if parent._is_userland_descriptor(desc):
- self.descriptor = desc
- self.parent = parent
-
def _comparator_factory(self, mapper):
return self.comparator_factory(self, mapper)
--- /dev/null
+"""
+
+tests for sqlalchemy.ext.hybrid TODO
+
+
+"""
+
+
+from sqlalchemy import *
+from sqlalchemy.orm import *
+from sqlalchemy.ext.declarative import declarative_base
+from sqlalchemy.ext import hybrid
+from sqlalchemy.orm.interfaces import PropComparator
+
+
+"""
+from sqlalchemy import *
+from sqlalchemy.orm import *
+from sqlalchemy.ext.declarative import declarative_base
+from sqlalchemy.ext import hybrid
+
+Base = declarative_base()
+
+
+class UCComparator(hybrid.Comparator):
+
+ def __eq__(self, other):
+ if other is None:
+ return self.expression == None
+ else:
+ return func.upper(self.expression) == func.upper(other)
+
+class A(Base):
+ __tablename__ = 'a'
+ id = Column(Integer, primary_key=True)
+ _value = Column("value", String)
+
+ @hybrid.property_
+ def value(self):
+ return int(self._value)
+
+ @value.comparator
+ def value(cls):
+ return UCComparator(cls._value)
+
+ @value.setter
+ def value(self, v):
+ self.value = v
+print aliased(A).value
+print aliased(A).__tablename__
+
+sess = create_session()
+
+print A.value == "foo"
+print sess.query(A.value)
+print sess.query(aliased(A).value)
+print sess.query(aliased(A)).filter_by(value="foo")
+"""
+
+"""
+from sqlalchemy import *
+from sqlalchemy.orm import *
+from sqlalchemy.ext.declarative import declarative_base
+from sqlalchemy.ext import hybrid
+
+Base = declarative_base()
+
+class A(Base):
+ __tablename__ = 'a'
+ id = Column(Integer, primary_key=True)
+ _value = Column("value", String)
+
+ @hybrid.property
+ def value(self):
+ return int(self._value)
+
+ @value.expression
+ def value(cls):
+ return func.foo(cls._value) + cls.bar_value
+
+ @value.setter
+ def value(self, v):
+ self.value = v
+
+ @hybrid.property
+ def bar_value(cls):
+ return func.bar(cls._value)
+
+#print A.value
+#print A.value.__doc__
+
+print aliased(A).value
+print aliased(A).__tablename__
+
+sess = create_session()
+
+print sess.query(A).filter_by(value="foo")
+
+print sess.query(aliased(A)).filter_by(value="foo")
+
+
+"""
\ No newline at end of file