]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
- fixed primary key update for many-to-many collections
authorMike Bayer <mike_mp@zzzcomputing.com>
Sat, 16 Aug 2008 23:10:56 +0000 (23:10 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sat, 16 Aug 2008 23:10:56 +0000 (23:10 +0000)
where the collection had not been loaded yet
[ticket:1127]

CHANGES
lib/sqlalchemy/orm/dependency.py
test/orm/naturalpks.py

diff --git a/CHANGES b/CHANGES
index 822b756d3d115e2bfd2cbb262519da8afd4c357c..afa8cc55a4573c28d20f25def1ffa14ad172d749 100644 (file)
--- 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
index a68cdafb51a5830832c7d4f25bebc223017a97ef..5fcaa4ab0f27957c980480b79c66bd6c50d0db90 100644 (file)
@@ -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)
index c9a5a71768a0167789a65c9689be1f80498b8700..d046fada650dd041da333e43e67c57054058363f 100644 (file)
@@ -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):