summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES3
-rw-r--r--lib/sqlalchemy/orm/mapper.py4
-rw-r--r--test/orm/mapper.py7
3 files changed, 12 insertions, 2 deletions
diff --git a/CHANGES b/CHANGES
index d43ec9c17..a21214298 100644
--- a/CHANGES
+++ b/CHANGES
@@ -48,6 +48,9 @@ CHANGES
- Repaired support for "passive-deletes" on a many-to-one
relation() with "delete" cascade. [ticket:1183]
+ - Fixed bug in composite types which prevented a primary-key
+ composite type from being mutated [ticket:1213].
+
- Added more granularity to internal attribute access, such that
cascade and flush operations will not initialize unloaded
attributes and collections, leaving them intact for a
diff --git a/lib/sqlalchemy/orm/mapper.py b/lib/sqlalchemy/orm/mapper.py
index c2bb73481..42597cda1 100644
--- a/lib/sqlalchemy/orm/mapper.py
+++ b/lib/sqlalchemy/orm/mapper.py
@@ -1289,10 +1289,10 @@ class Mapper(object):
params[col.key] = prop.get_col_value(col, history.added[0])
if col in pks:
if history.deleted:
- params[col._label] = history.deleted[0]
+ params[col._label] = prop.get_col_value(col, history.deleted[0])
else:
# row switch logic can reach us here
- params[col._label] = history.added[0]
+ params[col._label] = prop.get_col_value(col, history.added[0])
hasdata = True
elif col in pks:
params[col._label] = mapper._get_state_attr_by_column(state, col)
diff --git a/test/orm/mapper.py b/test/orm/mapper.py
index 8978059de..7c6984919 100644
--- a/test/orm/mapper.py
+++ b/test/orm/mapper.py
@@ -1637,7 +1637,14 @@ class CompositeTypesTest(_base.MappedTest):
g2 = sess.query(Graph).get(Version(1, 1))
eq_(g.version, g2.version)
+
+ # test pk mutation
+ g2.version = Version(2, 1)
+ sess.flush()
+ g3 = sess.query(Graph).get(Version(2, 1))
+ eq_(g2.version, g3.version)
+ # test pk with one column NULL
# TODO: can't seem to get NULL in for a PK value
# in either mysql or postgres, autoincrement=False etc.
# notwithstanding