summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/sqlalchemy/orm/mapper.py9
-rw-r--r--test/orm/test_mapper.py13
2 files changed, 22 insertions, 0 deletions
diff --git a/lib/sqlalchemy/orm/mapper.py b/lib/sqlalchemy/orm/mapper.py
index 74d8f3860..eb5abbd4f 100644
--- a/lib/sqlalchemy/orm/mapper.py
+++ b/lib/sqlalchemy/orm/mapper.py
@@ -974,6 +974,15 @@ class Mapper(InspectionAttr):
self._all_tables = self.inherits._all_tables
if self.polymorphic_identity is not None:
+ if self.polymorphic_identity in self.polymorphic_map:
+ util.warn(
+ "Reassigning polymorphic association for identity %r "
+ "from %r to %r: Check for duplicate use of %r as "
+ "value for polymorphic_identity." %
+ (self.polymorphic_identity,
+ self.polymorphic_map[self.polymorphic_identity],
+ self, self.polymorphic_identity)
+ )
self.polymorphic_map[self.polymorphic_identity] = self
else:
diff --git a/test/orm/test_mapper.py b/test/orm/test_mapper.py
index 63ba1a207..264b386d4 100644
--- a/test/orm/test_mapper.py
+++ b/test/orm/test_mapper.py
@@ -716,6 +716,19 @@ class MapperTest(_fixtures.FixtureTest, AssertsCompiledSQL):
m3.identity_key_from_instance(AddressUser())
)
+ def test_reassign_polymorphic_identity_warns(self):
+ User = self.classes.User
+ users = self.tables.users
+ class MyUser(User):
+ pass
+ m1 = mapper(User, users, polymorphic_on=users.c.name,
+ polymorphic_identity='user')
+ assert_raises_message(
+ sa.exc.SAWarning,
+ "Reassigning polymorphic association for identity 'user'",
+ mapper,
+ MyUser, users, inherits=User, polymorphic_identity='user'
+ )
def test_illegal_non_primary(self):