diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2019-01-29 23:53:10 -0600 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2019-01-30 21:06:27 -0600 |
commit | 147f6d382c3b6f06c8efa5a24c07c9849473e7af (patch) | |
tree | b3c1288d8d493bba638a3b07fd2bfdc7defa8fa6 /test/ext/declarative/test_basic.py | |
parent | b8f9517cddf41dbb47ae4ad120141c7ab1a29ac5 (diff) | |
download | sqlalchemy-147f6d382c3b6f06c8efa5a24c07c9849473e7af.tar.gz |
Add informative failure modes to _DeferredMapperConfig
Added some helper exceptions that invoke when a mapping based on
:class:`.AbstractConcreteBase`, :class:`.DeferredReflection`, or
:class:`.AutoMap` is used before the mapping is ready to be used, which
contain descriptive information on the class, rather than falling through
into other failure modes that are less informative.
Fixes: #4470
Change-Id: I9bc51697f63cedaa7809a0adb17b2398c209e289
Diffstat (limited to 'test/ext/declarative/test_basic.py')
-rw-r--r-- | test/ext/declarative/test_basic.py | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/test/ext/declarative/test_basic.py b/test/ext/declarative/test_basic.py index 8b60a1176..3fe2f1bfe 100644 --- a/test/ext/declarative/test_basic.py +++ b/test/ext/declarative/test_basic.py @@ -15,6 +15,7 @@ from sqlalchemy import util from sqlalchemy.ext import declarative as decl from sqlalchemy.ext.declarative import declared_attr from sqlalchemy.ext.declarative import synonym_for +from sqlalchemy.ext.declarative.base import _DeferredMapperConfig from sqlalchemy.ext.hybrid import hybrid_property from sqlalchemy.orm import backref from sqlalchemy.orm import class_mapper @@ -25,6 +26,7 @@ from sqlalchemy.orm import composite from sqlalchemy.orm import configure_mappers from sqlalchemy.orm import create_session from sqlalchemy.orm import deferred +from sqlalchemy.orm import exc as orm_exc from sqlalchemy.orm import joinedload from sqlalchemy.orm import mapper from sqlalchemy.orm import properties @@ -116,6 +118,37 @@ class DeclarativeTest(DeclarativeTestBase): eq_(a1, Address(email="two")) eq_(a1.user, User(name="u1")) + def test_deferred_reflection_default_error(self): + class MyExt(object): + @classmethod + def prepare(cls): + "sample prepare method" + to_map = _DeferredMapperConfig.classes_for_base(cls) + for thingy in to_map: + thingy.map() + + @classmethod + def _sa_decl_prepare(cls): + pass + + class User(MyExt, Base): + __tablename__ = "user" + id = Column(Integer, primary_key=True) + + assert_raises_message( + orm_exc.UnmappedClassError, + "Class test.ext.declarative.test_basic.User has a deferred " + "mapping on it. It is not yet usable as a mapped class.", + Session().query, + User, + ) + + User.prepare() + + self.assert_compile( + Session().query(User), 'SELECT "user".id AS user_id FROM "user"' + ) + def test_unicode_string_resolve(self): class User(Base, fixtures.ComparableEntity): __tablename__ = "users" |