]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- Class-bound attributes sent as arguments to
authorMike Bayer <mike_mp@zzzcomputing.com>
Sat, 19 Jul 2008 18:55:11 +0000 (18:55 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sat, 19 Jul 2008 18:55:11 +0000 (18:55 +0000)
relation()'s remote_side and foreign_keys parameters
are now accepted, allowing them to be used with declarative.

CHANGES
lib/sqlalchemy/orm/properties.py
test/ext/declarative.py

diff --git a/CHANGES b/CHANGES
index c518e9e0ef40880e044af7f7186c6694a78c5ead..4b3ec2ebe2323bdbe90b1f3b2ea4e694cd7c5890 100644 (file)
--- 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
index 47d20878fbfb6f339484d7a15899f9c15c34bd4a..51e0631e50a9f59997799994b6da9ae239014718 100644 (file)
@@ -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():
index 8ea3abd61a1f6e5e0ed6167504bdecbf372dad9d..0fafc599926dcaa4130c0b415197388b83ca5cdb 100644 (file)
@@ -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):