summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2008-08-16 23:10:56 +0000
committerMike Bayer <mike_mp@zzzcomputing.com>2008-08-16 23:10:56 +0000
commitdd9d9bd9be50fd5e64da43cbfeb088593baee103 (patch)
treea66c784d03014c70bd221c5891a4f23aa62ec24d
parent8e08949eb57592f4e3b3c1c8b92ef8935c150df7 (diff)
downloadsqlalchemy-dd9d9bd9be50fd5e64da43cbfeb088593baee103.tar.gz
- fixed primary key update for many-to-many collections
where the collection had not been loaded yet [ticket:1127]
-rw-r--r--CHANGES4
-rw-r--r--lib/sqlalchemy/orm/dependency.py5
-rw-r--r--test/orm/naturalpks.py10
3 files changed, 18 insertions, 1 deletions
diff --git a/CHANGES b/CHANGES
index 822b756d3..afa8cc55a 100644
--- a/CHANGES
+++ b/CHANGES
@@ -32,6 +32,10 @@ CHANGES
- class.someprop.in_() raises NotImplementedError pending
the implementation of "in_" for relation [ticket:1140]
+
+ - fixed primary key update for many-to-many collections
+ where the collection had not been loaded yet
+ [ticket:1127]
- Improved the behavior of query.join() when joining to
joined-table inheritance subclasses, using explicit join
diff --git a/lib/sqlalchemy/orm/dependency.py b/lib/sqlalchemy/orm/dependency.py
index a68cdafb5..5fcaa4ab0 100644
--- a/lib/sqlalchemy/orm/dependency.py
+++ b/lib/sqlalchemy/orm/dependency.py
@@ -433,7 +433,10 @@ class ManyToManyDP(DependencyProcessor):
uowcommit.attributes[(self, "manytomany", state, child)] = True
secondary_delete.append(associationrow)
- if not self.passive_updates and unchanged and self._pks_changed(uowcommit, state):
+ if not self.passive_updates and self._pks_changed(uowcommit, state):
+ if not unchanged:
+ (added, unchanged, deleted) = uowcommit.get_attribute_history(state, self.key, passive=False)
+
for child in unchanged:
associationrow = {}
sync.update(state, self.parent, associationrow, "old_", self.prop.synchronize_pairs)
diff --git a/test/orm/naturalpks.py b/test/orm/naturalpks.py
index c9a5a7176..d046fada6 100644
--- a/test/orm/naturalpks.py
+++ b/test/orm/naturalpks.py
@@ -134,6 +134,7 @@ class NaturalPKTest(_base.MappedTest):
assert sess.query(Address).get('jack1').username is None
u1 = sess.query(User).get('fred')
self.assertEquals(User(username='fred', fullname='jack'), u1)
+
@testing.fails_on('sqlite')
@testing.fails_on('mysql')
@@ -284,6 +285,15 @@ class NaturalPKTest(_base.MappedTest):
self.assertEquals(['jack'], [u.username for u in r[0].users])
self.assertEquals(Item(itemname='item2'), r[1])
self.assertEquals(['ed', 'jack'], sorted([u.username for u in r[1].users]))
+
+ sess.clear()
+ u2 = sess.query(User).get(u2.username)
+ u2.username='wendy'
+ sess.flush()
+ r = sess.query(Item).with_parent(u2).all()
+ self.assertEquals(Item(itemname='item2'), r[0])
+
+
class SelfRefTest(_base.MappedTest):
def define_tables(self, metadata):