summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2014-08-19 16:14:57 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2014-08-19 17:43:50 -0400
commit28103e9a865860a46037ca82e634827f2329deb0 (patch)
tree6fb9593cc87efcdb85b2f5d8bf8889f95c351c4b
parent399c03939768d4c8afb29ca1e091b046ea4fc88f (diff)
downloadsqlalchemy-28103e9a865860a46037ca82e634827f2329deb0.tar.gz
- simplify PK logic in update for row switch
-rw-r--r--lib/sqlalchemy/orm/mapper.py3
-rw-r--r--lib/sqlalchemy/orm/persistence.py22
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(