diff options
-rw-r--r-- | lib/sqlalchemy/ext/declarative.py | 5 | ||||
-rw-r--r-- | test/ext/declarative.py | 9 |
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): |