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:
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))
-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
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()