session.merge() does pointless None lookup

Issue #1618 resolved
Mike Bayer repo owner created an issue

given transient object:

        if key is None:  # key is None
            if dont_load:
                raise sa_exc.InvalidRequestError(
                    "merge() with dont_load=True option does not support "
                    "objects transient (i.e. unpersisted) objects.  flush() "
                    "all changes on mapped instances before merging with "
                    "dont_load=True.")


            key = mapper._identity_key_from_state(state)

            # now we have key == (<class 'mappedclass'>, (None,)) !!!!

        merged = None
        if key:
            if key in self.identity_map:
                merged = self.identity_map[key](key)
            elif dont_load:
                if state.modified:
                    raise sa_exc.InvalidRequestError(
                        "merge() with dont_load=True option does not support "
                        "objects marked as 'dirty'.  flush() all changes on "
                        "mapped instances before merging with dont_load=True.")
                merged = mapper.class_manager.new_instance()
                merged_state = attributes.instance_state(merged)
                merged_state.key = key
                self._update_impl(merged_state)
                new_instance = True
            else:

                # pointless get() occurs here !!!
                merged = self.query(mapper.class_).get(key[1](1))

Comments (3)

  1. Log in to comment