when the Session.is_active is True.
[ticket:2241]
- - Fixed previously untested function which regressed
- in 0.7, can now make a synonym() of a synonym()
- again.
-
- - Another previously unknown feature from 0.6, synonyms
- of relationship() can again be passed to join().
+ - Fixed a variety of synonym()-related regressions
+ from 0.6:
+ - making a synonym against a synonym now works.
+ - synonyms made against a relationship() can
+ be passed to query.join(), options sent
+ to query.options(), passed by name
+ to query.with_parent().
- Identity map .discard() uses dict.pop(,None)
internally instead of "del" to avoid KeyError/warning
lambda: self._comparator_factory(mapper),
doc=self.doc
)
- proxy_attr.property = self
proxy_attr.impl = _ProxyImpl(self.key)
mapper.class_manager.instrument_attribute(self.key, proxy_attr)
def _proxied_property(self):
return getattr(self.parent.class_, self.name).property
- @property
- def _synonym_resolved_property(self):
- return self._proxied_property
-
def _comparator_factory(self, mapper):
prop = self._proxied_property
if self.comparator_factory:
comp = self.comparator_factory(prop, mapper)
- elif isinstance(prop, DescriptorProperty):
- comp = prop._comparator_factory(mapper)
else:
comp = prop.comparator_factory(prop, mapper)
return comp
'name_syn':synonym('name'),
'addresses':relationship(Address),
'orders':relationship(Order, backref='user'), # o2m, m2o
- 'orders_syn':synonym('orders')
+ 'orders_syn':synonym('orders'),
+ 'orders_syn_2':synonym('orders_syn')
})
mapper(Address, addresses)
mapper(Order, orders, properties={
})
mapper(Keyword, keywords)
+ def test_options(self):
+ User, Order = self.classes.User, self.classes.Order
+
+ s = create_session()
+ def go():
+ result = s.query(User).filter_by(name='jack').\
+ options(joinedload(User.orders_syn)).all()
+ eq_(result, [
+ User(id=7, name='jack', orders=[
+ Order(description=u'order 1'),
+ Order(description=u'order 3'),
+ Order(description=u'order 5')
+ ])
+ ])
+ self.assert_sql_count(testing.db, go, 1)
+
+ def test_options_syn_of_syn(self):
+ User, Order = self.classes.User, self.classes.Order
+
+ s = create_session()
+ def go():
+ result = s.query(User).filter_by(name='jack').\
+ options(joinedload(User.orders_syn_2)).all()
+ eq_(result, [
+ User(id=7, name='jack', orders=[
+ Order(description=u'order 1'),
+ Order(description=u'order 3'),
+ Order(description=u'order 5')
+ ])
+ ])
+ self.assert_sql_count(testing.db, go, 1)
+
def test_joins(self):
User = self.classes.User
for j in (
['orders', 'items'],
['orders_syn', 'items'],
+ ['orders_syn_2', 'items'],
['orders', 'items_syn'],
['orders_syn', 'items_syn'],
+ ['orders_syn_2', 'items_syn'],
):
result = create_session().query(User).join(*j).filter_by(id=3).all()
assert [User(id=7, name='jack'), User(id=9, name='fred')] == result
- @testing.fails_if(lambda: True, "0.7 regression, may not support "
- "synonyms for relationship")
def test_with_parent(self):
Order, User = self.classes.Order, self.classes.User
('name', 'orders'),
('name_syn', 'orders'),
('name', 'orders_syn'),
+ ('name', 'orders_syn_2'),
('name_syn', 'orders_syn'),
+ ('name_syn', 'orders_syn_2'),
):
sess = create_session()
q = sess.query(User)
u1 = q.filter_by(**{nameprop:'jack'}).one()
o = sess.query(Order).with_parent(u1, property=orderprop).all()
- assert [Order(description="order 1"), Order(description="order 3"), Order(description="order 5")] == o
+ assert [Order(description="order 1"),
+ Order(description="order 3"), Order(description="order 5")] == o
class ImmediateTest(_fixtures.FixtureTest):