]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
merged r6342 from trunk for [ticket:1527]
authorMike Bayer <mike_mp@zzzcomputing.com>
Sat, 12 Sep 2009 20:37:43 +0000 (20:37 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sat, 12 Sep 2009 20:37:43 +0000 (20:37 +0000)
CHANGES
lib/sqlalchemy/ext/declarative.py
test/ext/test_declarative.py

diff --git a/CHANGES b/CHANGES
index 2ed260a4c10868befba3567953ce6cf032f442c9..d19085c00fe8fb31bf1d475f1f3a45fdd20b8a54 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -127,6 +127,11 @@ CHANGES
      __table_args__ is passed as a tuple with no dict argument.
      Improved documentation.  [ticket:1468]
 
+   - Table objects declared in the MetaData can now be used
+     in string expressions sent to primaryjoin/secondaryjoin/
+     secondary - the name is pulled from the MetaData of the
+     declarative base.  [ticket:1527]
+     
    - A column can be added to a joined-table subclass after
      the class has been constructed (i.e. via class-level
      attribute assignment).  The column is added to the underlying
index 07974caccea3b6082f7b073dfeb2d451a3c7874d..77dbcaf781bd169c6412bc4af2787aa87db21da9 100644 (file)
@@ -600,9 +600,11 @@ def _deferred_relation(cls, prop):
         import sqlalchemy
         
         def access_cls(key):
-            try:
+            if key in cls._decl_class_registry:
                 return _GetColumns(cls._decl_class_registry[key])
-            except KeyError:
+            elif key in cls.metadata.tables:
+                return cls.metadata.tables[key]
+            else:
                 return sqlalchemy.__dict__[key]
 
         d = util.PopulateDict(access_cls)
index f48777886928165f0914ab5d4cb6028dd9db51c6..bb4c616a649a862a2f8c25754274aa93d9a7d68e 100644 (file)
@@ -176,7 +176,31 @@ class DeclarativeTest(DeclarativeTestBase):
         compile_mappers()
         eq_(str(User.addresses.property.primaryjoin), str(Address.user.property.primaryjoin))
         
+    def test_string_dependency_resolution_tables(self):
+        class User(Base, ComparableEntity):
+            __tablename__ = 'users'
+            id = Column(Integer, primary_key=True)
+            name = Column(String(50))
+            
+            props = relation("Prop", 
+                        secondary="user_to_prop", 
+                        primaryjoin="User.id==user_to_prop.c.user_id", 
+                        secondaryjoin="user_to_prop.c.prop_id==Prop.id", 
+                    backref="users")
+
+        class Prop(Base, ComparableEntity):
+            __tablename__ = 'props'
+            id = Column(Integer, primary_key=True)
+            name = Column(String(50))
         
+        user_to_prop = Table('user_to_prop', Base.metadata, 
+            Column('user_id', Integer, ForeignKey('users.id')),
+            Column('prop_id', Integer, ForeignKey('props.id')),
+        )
+
+        compile_mappers()
+        assert class_mapper(User).get_property("props").secondary is user_to_prop
+
     def test_uncompiled_attributes_in_relation(self):
         class Address(Base, ComparableEntity):
             __tablename__ = 'addresses'