summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2009-12-07 22:39:33 +0000
committerMike Bayer <mike_mp@zzzcomputing.com>2009-12-07 22:39:33 +0000
commit2fbdb67cbec56a85e3fe000db94eee14101a47fa (patch)
treeb4da04597a008a1df7acec1cb6385a89e03a621e /lib/sqlalchemy
parent3b0f5d0cfd81298d3b355e443a3df06123d2c6bb (diff)
downloadsqlalchemy-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.py39
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)