diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2017-08-31 15:46:53 -0400 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2017-08-31 17:21:35 -0400 |
commit | 3feea4503ff211cdd1f6046b4b8ae16cf0dd08a3 (patch) | |
tree | dfe1746528dc81c84b2e00936625de9fe687ecdc /lib/sqlalchemy | |
parent | 2efd89d02941ab4267d6e2842963fd38b1539f6c (diff) | |
download | sqlalchemy-3feea4503ff211cdd1f6046b4b8ae16cf0dd08a3.tar.gz |
Consider merge key with (None, ) as non-persistent
Fixed bug in :meth:`.Session.merge` where objects in a collection that had
the primary key attribute set to ``None`` for a key that is typically
autoincrementing would be considered to be a database-persisted key for
part of the internal deduplication process, causing only one object to
actually be inserted in the database.
Change-Id: I0a6e00043be0b2979cda33740e1be3b430ecf8c7
Fixes: #4056
(cherry picked from commit 5243341ed886e10a0d3f7fef8ae3d071e0ffdcf0)
Diffstat (limited to 'lib/sqlalchemy')
-rw-r--r-- | lib/sqlalchemy/orm/session.py | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/lib/sqlalchemy/orm/session.py b/lib/sqlalchemy/orm/session.py index 6ecef17f1..5488c3031 100644 --- a/lib/sqlalchemy/orm/session.py +++ b/lib/sqlalchemy/orm/session.py @@ -1912,7 +1912,10 @@ class Session(_SessionClassMethods): "all changes on mapped instances before merging with " "load=False.") key = mapper._identity_key_from_state(state) - key_is_persistent = attributes.NEVER_SET not in key[1] + key_is_persistent = attributes.NEVER_SET not in key[1] and ( + not _none_set.intersection(key[1]) or + (mapper.allow_partial_pks and not _none_set.issuperset(key[1])) + ) else: key_is_persistent = True @@ -1933,10 +1936,7 @@ class Session(_SessionClassMethods): self._update_impl(merged_state) new_instance = True - elif key_is_persistent and ( - not _none_set.intersection(key[1]) or - (mapper.allow_partial_pks and - not _none_set.issuperset(key[1]))): + elif key_is_persistent: merged = self.query(mapper.class_).get(key[1]) else: merged = None |