]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
error raised if trying to auto-join on a self referential
authorMike Bayer <mike_mp@zzzcomputing.com>
Wed, 28 Mar 2007 17:48:02 +0000 (17:48 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Wed, 28 Mar 2007 17:48:02 +0000 (17:48 +0000)
lib/sqlalchemy/orm/query.py
test/orm/generative.py

index 77499c2714343e7840ac0f167da3c9af3965fe7b..b1a267431d445ff8b17241e2fbee77898775238f 100644 (file)
@@ -442,6 +442,8 @@ class Query(object):
             keys = []
             for key in prop:
                 p = mapper.props[key]
+                if p._is_self_referential():
+                    raise exceptions.InvalidRequestError("Self-referential query on '%s' property must be constructed manually using an Alias object for the related table." % (str(p)))
                 keys.append(key)
                 mapper = p.mapper
         else:
@@ -450,6 +452,8 @@ class Query(object):
         mapper = self._joinpoint
         for key in keys:
             prop = mapper.props[key]
+            if prop._is_self_referential():
+                raise exceptions.InvalidRequestError("Self-referential query on '%s' property must be constructed manually using an Alias object for the related table." % str(prop))
             if outerjoin:
                 if prop.secondary:
                     clause = clause.outerjoin(prop.secondary, prop.get_join(mapper, primary=True, secondary=False))
index b8c2a85e1b5b7fd7b7feb348537d8a06b5155671..6cda219645635688cf5e1c11d93c29ed37c0e715 100644 (file)
@@ -1,9 +1,9 @@
-from testbase import PersistTest, AssertMixin
+from testbase import PersistTest, AssertMixin, ORMTest
 import testbase
 import tables
 
 from sqlalchemy import *
-
+from sqlalchemy import exceptions
 
 class Foo(object):
     pass
@@ -233,6 +233,30 @@ class CaseSensitiveTest(PersistTest):
         res = self.query.filter(and_(table1.c.ID==table2.c.T1ID,table2.c.T1ID==1)).distinct()
         self.assertEqual(res.count(), 1)
 
+class SelfRefTest(ORMTest):
+    def define_tables(self, metadata):
+        global t1
+        t1 = Table('t1', metadata, 
+            Column('id', Integer, primary_key=True),
+            Column('parent_id', Integer, ForeignKey('t1.id'))
+            )
+    def test_noautojoin(self):
+        class T(object):pass
+        mapper(T, t1, properties={'children':relation(T)})
+        sess = create_session()
+        try:
+            sess.query(T).join('children').select_by(id=7)
+            assert False
+        except exceptions.InvalidRequestError, e:
+            assert str(e) == "Self-referential query on 'T.children (T)' property must be constructed manually using an Alias object for the related table.", str(e)
 
+        try:
+            sess.query(T).join(['children']).select_by(id=7)
+            assert False
+        except exceptions.InvalidRequestError, e:
+            assert str(e) == "Self-referential query on 'T.children (T)' property must be constructed manually using an Alias object for the related table.", str(e)
+        
+            
+            
 if __name__ == "__main__":
     testbase.main()