diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2008-08-16 23:10:56 +0000 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2008-08-16 23:10:56 +0000 |
commit | dd9d9bd9be50fd5e64da43cbfeb088593baee103 (patch) | |
tree | a66c784d03014c70bd221c5891a4f23aa62ec24d | |
parent | 8e08949eb57592f4e3b3c1c8b92ef8935c150df7 (diff) | |
download | sqlalchemy-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-- | CHANGES | 4 | ||||
-rw-r--r-- | lib/sqlalchemy/orm/dependency.py | 5 | ||||
-rw-r--r-- | test/orm/naturalpks.py | 10 |
3 files changed, 18 insertions, 1 deletions
@@ -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): |