]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
made Session.merge cascades not trigger autoflush
authorAnts Aasma <ants.aasma@gmail.com>
Tue, 2 Dec 2008 19:14:15 +0000 (19:14 +0000)
committerAnts Aasma <ants.aasma@gmail.com>
Tue, 2 Dec 2008 19:14:15 +0000 (19:14 +0000)
CHANGES
lib/sqlalchemy/orm/session.py
test/orm/merge.py

diff --git a/CHANGES b/CHANGES
index 00aac79d87b0f3fb3421b21617a6f178f0082485..82f770949b4ff90be8e49953cbd49119e2834cde 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -52,6 +52,10 @@ CHANGES
       in shard API, removed errant result.close()
       left over from the 0.4 version. [ticket:1099]
       [ticket:1228]
+
+    - made Session.merge cascades not trigger autoflush.
+      Fixes merged instances getting prematurely inserted
+      with missing values.
       
 - sql
     - Fixed the import weirdness in sqlalchemy.sql
index a0f2f1f521af0a1b2f48a33704fe98fb43f2c867..c98cbe6b365f19aab0258d9f34de4f68c33293c5 100644 (file)
@@ -1172,6 +1172,9 @@ class Session(object):
             # TODO: this should be an IdentityDict for instances, but will
             # need a separate dict for PropertyLoader tuples
             _recursive = {}
+            # Autoflush only on the topmost call
+            self._autoflush()
+
         mapper = _object_mapper(instance)
         if instance in _recursive:
             return _recursive[instance]
@@ -1204,7 +1207,7 @@ class Session(object):
                 self._update_impl(merged_state)
                 new_instance = True
             else:
-                merged = self.query(mapper.class_).get(key[1])
+                merged = self.query(mapper.class_).autoflush(False).get(key[1])
 
         if merged is None:
             merged = mapper.class_manager.new_instance()
index 2484baab60c2e7545a9ac340db80e5029da2bd85..12c16e4b11256ea1d71af2b2e73969ce5db4ae16 100644 (file)
@@ -665,5 +665,16 @@ class MergeTest(_fixtures.FixtureTest):
         sess.expunge(u)
         sess.merge(u)
 
+    @testing.resolve_artifact_names
+    def test_cascades_dont_autoflush(self):
+        sess = create_session(autoflush=True)
+        m = mapper(User, users, properties={
+            'addresses':relation(mapper(Address, addresses),backref='user')})
+        user = User(id=8, name='fred', addresses=[Address(email_address='user')])
+        merged_user = sess.merge(user)
+        assert merged_user in sess.new
+        sess.flush()
+        assert merged_user not in sess.new
+
 if __name__ == "__main__":
     testenv.main()