From: Mike Bayer Date: Wed, 28 Mar 2007 17:48:02 +0000 (+0000) Subject: error raised if trying to auto-join on a self referential X-Git-Tag: rel_0_3_7~97 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5df24224ca87d44b8fa772070984d895582a4892;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git error raised if trying to auto-join on a self referential --- diff --git a/lib/sqlalchemy/orm/query.py b/lib/sqlalchemy/orm/query.py index 77499c2714..b1a267431d 100644 --- a/lib/sqlalchemy/orm/query.py +++ b/lib/sqlalchemy/orm/query.py @@ -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)) diff --git a/test/orm/generative.py b/test/orm/generative.py index b8c2a85e1b..6cda219645 100644 --- a/test/orm/generative.py +++ b/test/orm/generative.py @@ -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()