]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
descriptive error message raised when string-based relation() expressions inadvertent...
authorMike Bayer <mike_mp@zzzcomputing.com>
Sun, 3 Aug 2008 18:39:53 +0000 (18:39 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sun, 3 Aug 2008 18:39:53 +0000 (18:39 +0000)
lib/sqlalchemy/ext/declarative.py
test/ext/declarative.py

index 2a6facb55c788b283c9969d420eaf34e9f8f94ea..8a58ca25d28fbfad3d780c1137e3a1321236ff7a 100644 (file)
@@ -328,7 +328,10 @@ class _GetColumns(object):
         if not mapper:
             return getattr(self.cls, key)
         else:
-            return mapper.get_property(key).columns[0]
+            prop = mapper.get_property(key)
+            if not isinstance(prop, ColumnProperty):
+                raise exceptions.InvalidRequestError("Property %r is not an instance of ColumnProperty (i.e. does not correspnd directly to a Column)." % key)
+            return prop.columns[0]
 
 
 def _deferred_relation(cls, prop):
index 31f0dfd2d85b8c0f79810fd6375ee5c2f6ca2717..55d9aece8bbd36bde668537fffc9cbf2d7468e3a 100644 (file)
@@ -1,9 +1,10 @@
 import testenv; testenv.configure_for_tests()
 
 from sqlalchemy.ext import declarative as decl
+from sqlalchemy import exc
 from testlib import sa, testing
 from testlib.sa import MetaData, Table, Column, Integer, String, ForeignKey, ForeignKeyConstraint, asc
-from testlib.sa.orm import relation, create_session, class_mapper, eagerload
+from testlib.sa.orm import relation, create_session, class_mapper, eagerload, compile_mappers
 from testlib.testing import eq_
 from orm._base import ComparableEntity
 
@@ -107,6 +108,12 @@ 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')])
         )
+        
+        class Foo(Base, ComparableEntity):
+            __tablename__ = 'foo'
+            id = Column(Integer, primary_key=True)
+            rel = relation("User", primaryjoin="User.addresses==Foo.id")
+        self.assertRaisesMessage(exc.InvalidRequestError, "'addresses' is not an instance of ColumnProperty", compile_mappers)
     
     def test_uncompiled_attributes_in_relation(self):
         class Address(Base, ComparableEntity):