diff options
-rw-r--r-- | lib/sqlalchemy/ext/declarative.py | 7 | ||||
-rw-r--r-- | test/ext/declarative.py | 14 |
2 files changed, 19 insertions, 2 deletions
diff --git a/lib/sqlalchemy/ext/declarative.py b/lib/sqlalchemy/ext/declarative.py index 784236662..62691a906 100644 --- a/lib/sqlalchemy/ext/declarative.py +++ b/lib/sqlalchemy/ext/declarative.py @@ -161,7 +161,7 @@ from sqlalchemy.schema import Table, SchemaItem, Column, MetaData from sqlalchemy.orm import synonym as _orm_synonym, mapper, comparable_property from sqlalchemy.orm.interfaces import MapperProperty from sqlalchemy.orm.properties import PropertyLoader, ColumnProperty -from sqlalchemy import util +from sqlalchemy import util, exceptions __all__ = ['declarative_base', 'synonym_for', 'comparable_using', 'declared_synonym'] @@ -237,7 +237,10 @@ def _deferred_relation(cls, prop): if isinstance(prop, PropertyLoader) and isinstance(prop.argument, basestring): arg = prop.argument def return_cls(): - return cls._decl_class_registry[arg] + try: + return cls._decl_class_registry[arg] + except KeyError: + raise exceptions.InvalidRequestError("When compiling mapper %s, could not locate a declarative class named %r. Consider adding this property to the %r class after both dependent classes have been defined." % (prop.parent, arg, prop.parent.class_)) prop.argument = return_cls return prop diff --git a/test/ext/declarative.py b/test/ext/declarative.py index 6e7ff361c..6b6b90ea0 100644 --- a/test/ext/declarative.py +++ b/test/ext/declarative.py @@ -57,6 +57,20 @@ class DeclarativeTest(TestBase, AssertsExecutionResults): self.assertEquals(a1, Address(email='two')) self.assertEquals(a1.user, User(name='u1')) + def test_nice_dependency_error(self): + class User(Base): + __tablename__ = 'users' + id = Column('id', Integer, primary_key=True) + addresses = relation("Address") + + def go(): + class Address(Base): + __tablename__ = 'addresses' + + id = Column(Integer, primary_key=True) + foo = column_property(User.id==5) + self.assertRaises(exceptions.InvalidRequestError, go) + def test_add_prop(self): class User(Base, Fixture): __tablename__ = 'users' |