]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
warn on duplicate polymorphic_identity
authorSebastian Bank <sebastian.bank@uni-leipzig.de>
Thu, 4 Dec 2014 13:34:08 +0000 (14:34 +0100)
committerSebastian Bank <sebastian.bank@uni-leipzig.de>
Thu, 4 Dec 2014 13:34:08 +0000 (14:34 +0100)
lib/sqlalchemy/orm/mapper.py
test/orm/test_mapper.py

index 863dab5cbfb923671c0061ee117c7c7979c49914..0e0c1a83373c01e61f90749c17eab6cbe81b9a7e 100644 (file)
@@ -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:
index 63ba1a207f4d82695a04a639c648c50dadbd7613..264b386d487077b5c5ed5a0b3d4bba66a5afb31f 100644 (file)
@@ -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):