diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2014-08-19 16:14:57 -0400 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2014-08-19 17:43:50 -0400 |
commit | 28103e9a865860a46037ca82e634827f2329deb0 (patch) | |
tree | 6fb9593cc87efcdb85b2f5d8bf8889f95c351c4b | |
parent | 399c03939768d4c8afb29ca1e091b046ea4fc88f (diff) | |
download | sqlalchemy-28103e9a865860a46037ca82e634827f2329deb0.tar.gz |
- simplify PK logic in update for row switch
-rw-r--r-- | lib/sqlalchemy/orm/mapper.py | 3 | ||||
-rw-r--r-- | lib/sqlalchemy/orm/persistence.py | 22 |
2 files changed, 9 insertions, 16 deletions
diff --git a/lib/sqlalchemy/orm/mapper.py b/lib/sqlalchemy/orm/mapper.py index 89c092b58..f22cac329 100644 --- a/lib/sqlalchemy/orm/mapper.py +++ b/lib/sqlalchemy/orm/mapper.py @@ -2364,6 +2364,9 @@ class Mapper(InspectionAttr): @_memoized_configured_property def _primary_key_props(self): + # TODO: this should really be called "identity key props", + # as it does not necessarily include primary key columns within + # individual tables return [self._columntoproperty[col] for col in self.primary_key] def _get_state_attr_by_column( diff --git a/lib/sqlalchemy/orm/persistence.py b/lib/sqlalchemy/orm/persistence.py index e36f87991..37b696d0f 100644 --- a/lib/sqlalchemy/orm/persistence.py +++ b/lib/sqlalchemy/orm/persistence.py @@ -362,29 +362,19 @@ def _collect_update_commands(uowtransaction, table, states_to_update): history = state.manager[propkey].impl.get_history( state, state_dict, attributes.PASSIVE_OFF) - if row_switch and not history.deleted and history.added: - # row switch present. convert a row that thought - # it would be an INSERT into an UPDATE, by removing - # the PK value from the SET clause and instead putting - # it in the WHERE clause. - del params[col.key] - pk_params[col._label] = history.added[0] - elif history.added: - # we're updating the PK value. - assert history.deleted, ( - "New PK value without an old one not " - "possible for an UPDATE") - # check if an UPDATE of the PK value - # has already occurred as a result of ON UPDATE CASCADE. - # If so, use the new value to locate the row. - if ("pk_cascaded", state, col) in uowtransaction.attributes: + if history.added: + if not history.deleted or \ + ("pk_cascaded", state, col) in uowtransaction.attributes: pk_params[col._label] = history.added[0] + params.pop(col.key, None) else: # else, use the old value to locate the row pk_params[col._label] = history.deleted[0] + params[col.key] = history.added[0] else: pk_params[col._label] = history.unchanged[0] + if params or value_params: if None in pk_params.values(): raise orm_exc.FlushError( |