summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/sqlalchemy/ext/declarative.py7
-rw-r--r--test/ext/declarative.py14
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'