From: Mike Bayer Date: Sat, 19 Jul 2008 18:55:11 +0000 (+0000) Subject: - Class-bound attributes sent as arguments to X-Git-Tag: rel_0_5beta3~29 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c5141f2981a69c18338ccabc97067d1d563d43a9;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - Class-bound attributes sent as arguments to relation()'s remote_side and foreign_keys parameters are now accepted, allowing them to be used with declarative. --- diff --git a/CHANGES b/CHANGES index c518e9e0ef..4b3ec2ebe2 100644 --- a/CHANGES +++ b/CHANGES @@ -31,6 +31,11 @@ CHANGES no longer referenced items from the session as they were present in a list of items to be processed, typically during session.expunge_all() and dependent methods. + +- ext + - Class-bound attributes sent as arguments to + relation()'s remote_side and foreign_keys parameters + are now accepted, allowing them to be used with declarative. - mysql - Quoting of MSEnum values for use in CREATE TABLE is now diff --git a/lib/sqlalchemy/orm/properties.py b/lib/sqlalchemy/orm/properties.py index 47d20878fb..51e0631e50 100644 --- a/lib/sqlalchemy/orm/properties.py +++ b/lib/sqlalchemy/orm/properties.py @@ -532,9 +532,9 @@ class PropertyLoader(StrategizedProperty): for attr in ('order_by', 'primaryjoin', 'secondaryjoin', 'secondary', '_foreign_keys', 'remote_side'): if callable(getattr(self, attr)): setattr(self, attr, getattr(self, attr)()) - - self._foreign_keys = util.to_set(self._foreign_keys) - self.remote_side = util.to_set(self.remote_side) + + self._foreign_keys = set(expression._literal_as_column(x) for x in util.to_set(self._foreign_keys)) + self.remote_side = set(expression._literal_as_column(x) for x in util.to_set(self.remote_side)) if not self.parent.concrete: for inheriting in self.parent.iterate_to_root(): diff --git a/test/ext/declarative.py b/test/ext/declarative.py index 8ea3abd61a..0fafc59992 100644 --- a/test/ext/declarative.py +++ b/test/ext/declarative.py @@ -107,7 +107,33 @@ class DeclarativeTest(testing.TestBase, testing.AssertsExecutionResults): self.assertEquals(sess.query(User).filter(User.name == 'ed').one(), User(name='ed', addresses=[Address(email='xyz'), Address(email='def'), Address(email='abc')]) ) - + + def test_uncompiled_attributes_in_relation(self): + class Address(Base, ComparableEntity): + __tablename__ = 'addresses' + id = Column(Integer, primary_key=True) + email = Column(String(50)) + user_id = Column(Integer) # note no foreign key + + class User(Base, ComparableEntity): + __tablename__ = 'users' + id = Column(Integer, primary_key=True) + name = Column(String(50)) + addresses = relation("Address", order_by=Address.email, + foreign_keys=Address.user_id, remote_side=Address.user_id, + primaryjoin=id==Address.user_id, + ) + + Base.metadata.create_all() + + sess = create_session() + u1 = User(name='ed', addresses=[Address(email='abc'), Address(email='xyz'), Address(email='def')]) + sess.add(u1) + sess.flush() + sess.clear() + self.assertEquals(sess.query(User).filter(User.name == 'ed').one(), + User(name='ed', addresses=[Address(email='abc'), Address(email='def'), Address(email='xyz')]) + ) def test_nice_dependency_error(self): class User(Base):