summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/sqlalchemy/ext/declarative.py5
-rw-r--r--test/ext/declarative.py9
2 files changed, 12 insertions, 2 deletions
diff --git a/lib/sqlalchemy/ext/declarative.py b/lib/sqlalchemy/ext/declarative.py
index 2a6facb55..8a58ca25d 100644
--- a/lib/sqlalchemy/ext/declarative.py
+++ b/lib/sqlalchemy/ext/declarative.py
@@ -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):
diff --git a/test/ext/declarative.py b/test/ext/declarative.py
index 31f0dfd2d..55d9aece8 100644
--- a/test/ext/declarative.py
+++ b/test/ext/declarative.py
@@ -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):