diff options
author | mike bayer <mike_mp@zzzcomputing.com> | 2020-01-30 16:15:56 +0000 |
---|---|---|
committer | Gerrit Code Review <gerrit@bbpush.zzzcomputing.com> | 2020-01-30 16:15:56 +0000 |
commit | 237724d338bf8fd88a24f2bb9dd0c800bda7dbde (patch) | |
tree | 04d126116fb6b48691a9996721d922953ba95a61 /test/orm/inheritance/test_basic.py | |
parent | 447dec2c15f7b749a3e98df93c001b1b9a36ed32 (diff) | |
parent | c741b89bd57eb31b7a1bbd187a4d159bdfea5111 (diff) | |
download | sqlalchemy-237724d338bf8fd88a24f2bb9dd0c800bda7dbde.tar.gz |
Merge "Raise for unexpected polymorphic identity"
Diffstat (limited to 'test/orm/inheritance/test_basic.py')
-rw-r--r-- | test/orm/inheritance/test_basic.py | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/test/orm/inheritance/test_basic.py b/test/orm/inheritance/test_basic.py index ebb485156..831781330 100644 --- a/test/orm/inheritance/test_basic.py +++ b/test/orm/inheritance/test_basic.py @@ -3410,6 +3410,96 @@ class DiscriminatorOrPkNoneTest(fixtures.DeclarativeMappedTest): ) +class UnexpectedPolymorphicIdentityTest(fixtures.DeclarativeMappedTest): + run_setup_mappers = "once" + __dialect__ = "default" + + @classmethod + def setup_classes(cls): + Base = cls.DeclarativeBasic + + class AJoined(fixtures.ComparableEntity, Base): + __tablename__ = "ajoined" + id = Column(Integer, primary_key=True) + type = Column(String(10), nullable=False) + __mapper_args__ = { + "polymorphic_on": type, + "polymorphic_identity": "a", + } + + class AJoinedSubA(AJoined): + __tablename__ = "ajoinedsuba" + id = Column(ForeignKey("ajoined.id"), primary_key=True) + __mapper_args__ = {"polymorphic_identity": "suba"} + + class AJoinedSubB(AJoined): + __tablename__ = "ajoinedsubb" + id = Column(ForeignKey("ajoined.id"), primary_key=True) + __mapper_args__ = {"polymorphic_identity": "subb"} + + class ASingle(fixtures.ComparableEntity, Base): + __tablename__ = "asingle" + id = Column(Integer, primary_key=True) + type = Column(String(10), nullable=False) + __mapper_args__ = { + "polymorphic_on": type, + "polymorphic_identity": "a", + } + + class ASingleSubA(ASingle): + __mapper_args__ = {"polymorphic_identity": "suba"} + + class ASingleSubB(ASingle): + __mapper_args__ = {"polymorphic_identity": "subb"} + + @classmethod + def insert_data(cls): + ASingleSubA, ASingleSubB, AJoinedSubA, AJoinedSubB = cls.classes( + "ASingleSubA", "ASingleSubB", "AJoinedSubA", "AJoinedSubB" + ) + s = Session() + + s.add_all([ASingleSubA(), ASingleSubB(), AJoinedSubA(), AJoinedSubB()]) + s.commit() + + def test_single_invalid_ident(self): + ASingle, ASingleSubA = self.classes("ASingle", "ASingleSubA") + + s = Session() + + q = s.query(ASingleSubA).select_entity_from( + select([ASingle]).subquery() + ) + + assert_raises_message( + sa_exc.InvalidRequestError, + r"Row with identity key \(.*ASingle.*\) can't be loaded into an " + r"object; the polymorphic discriminator column '.*.type' refers " + r"to mapped class ASingleSubB->asingle, which is not a " + r"sub-mapper of the requested mapped class ASingleSubA->asingle", + q.all, + ) + + def test_joined_invalid_ident(self): + AJoined, AJoinedSubA = self.classes("AJoined", "AJoinedSubA") + + s = Session() + + q = s.query(AJoinedSubA).select_entity_from( + select([AJoined]).subquery() + ) + + assert_raises_message( + sa_exc.InvalidRequestError, + r"Row with identity key \(.*AJoined.*\) can't be loaded into an " + r"object; the polymorphic discriminator column '.*.type' refers " + r"to mapped class AJoinedSubB->ajoinedsubb, which is not a " + r"sub-mapper of the requested mapped class " + r"AJoinedSubA->ajoinedsuba", + q.all, + ) + + class NameConflictTest(fixtures.MappedTest): @classmethod def define_tables(cls, metadata): |