diff options
Diffstat (limited to 'lib/sqlalchemy/orm/loading.py')
-rw-r--r-- | lib/sqlalchemy/orm/loading.py | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/lib/sqlalchemy/orm/loading.py b/lib/sqlalchemy/orm/loading.py index f07067d17..94a9b8d22 100644 --- a/lib/sqlalchemy/orm/loading.py +++ b/lib/sqlalchemy/orm/loading.py @@ -633,6 +633,20 @@ def _instance_processor( if mapper.polymorphic_map and not _polymorphic_from and not refresh_state: # if we are doing polymorphic, dispatch to a different _instance() # method specific to the subclass mapper + + def ensure_no_pk(row): + identitykey = ( + identity_class, + tuple([row[column] for column in pk_cols]), + identity_token, + ) + if not is_not_primary_key(identitykey[1]): + raise sa_exc.InvalidRequestError( + "Row with identity key %s can't be loaded into an " + "object; the polymorphic discriminator column '%s' is " + "NULL" % (identitykey, polymorphic_discriminator) + ) + _instance = _decorate_polymorphic_switch( _instance, context, @@ -641,6 +655,7 @@ def _instance_processor( path, polymorphic_discriminator, adapter, + ensure_no_pk, ) return _instance @@ -804,6 +819,7 @@ def _decorate_polymorphic_switch( path, polymorphic_discriminator, adapter, + ensure_no_pk, ): if polymorphic_discriminator is not None: polymorphic_on = polymorphic_discriminator @@ -843,7 +859,11 @@ def _decorate_polymorphic_switch( _instance = polymorphic_instances[discriminator] if _instance: return _instance(row) - return instance_fn(row) + else: + return instance_fn(row) + else: + ensure_no_pk(row) + return None return polymorphic_instance |