diff options
| author | Mike Bayer <mike_mp@zzzcomputing.com> | 2009-12-07 22:39:33 +0000 |
|---|---|---|
| committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2009-12-07 22:39:33 +0000 |
| commit | 2fbdb67cbec56a85e3fe000db94eee14101a47fa (patch) | |
| tree | b4da04597a008a1df7acec1cb6385a89e03a621e /lib/sqlalchemy | |
| parent | 3b0f5d0cfd81298d3b355e443a3df06123d2c6bb (diff) | |
| download | sqlalchemy-2fbdb67cbec56a85e3fe000db94eee14101a47fa.tar.gz | |
- Fixed a needless select which would occur when merging
transient objects that contained a null primary key
identifier. [ticket:1618]
Diffstat (limited to 'lib/sqlalchemy')
| -rw-r--r-- | lib/sqlalchemy/orm/session.py | 39 |
1 files changed, 20 insertions, 19 deletions
diff --git a/lib/sqlalchemy/orm/session.py b/lib/sqlalchemy/orm/session.py index c0b5666b0..d3d02ef3f 100644 --- a/lib/sqlalchemy/orm/session.py +++ b/lib/sqlalchemy/orm/session.py @@ -19,7 +19,7 @@ from sqlalchemy.orm.util import class_mapper as _class_mapper from sqlalchemy.orm.util import ( _class_to_mapper, _state_has_identity, _state_mapper, ) -from sqlalchemy.orm.mapper import Mapper +from sqlalchemy.orm.mapper import Mapper, _none_set from sqlalchemy.orm.unitofwork import UOWTransaction from sqlalchemy.orm import identity @@ -1124,7 +1124,7 @@ class Session(object): new_instance = False state = attributes.instance_state(instance) key = state.key - + if key is None: if not load: raise sa_exc.InvalidRequestError( @@ -1134,24 +1134,25 @@ class Session(object): "load=False.") key = mapper._identity_key_from_state(state) - merged = None - if key: - if key in self.identity_map: - merged = self.identity_map[key] - elif not load: - if state.modified: - raise sa_exc.InvalidRequestError( - "merge() with load=False option does not support " - "objects marked as 'dirty'. flush() all changes on " - "mapped instances before merging with load=False.") - 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: - merged = self.query(mapper.class_).get(key[1]) + if key in self.identity_map: + merged = self.identity_map[key] + elif not load: + if state.modified: + raise sa_exc.InvalidRequestError( + "merge() with load=False option does not support " + "objects marked as 'dirty'. flush() all changes on " + "mapped instances before merging with load=False.") + merged = mapper.class_manager.new_instance() + merged_state = attributes.instance_state(merged) + merged_state.key = key + self._update_impl(merged_state) + new_instance = True + elif not _none_set.issuperset(key[1]): + merged = self.query(mapper.class_).get(key[1]) + else: + merged = None + if merged is None: merged = mapper.class_manager.new_instance() merged_state = attributes.instance_state(merged) |
