From: Ants Aasma Date: Tue, 2 Dec 2008 19:14:15 +0000 (+0000) Subject: made Session.merge cascades not trigger autoflush X-Git-Tag: rel_0_5_0~150 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=20b202e2209d2ae62db777f13c13778a90e3af4a;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git made Session.merge cascades not trigger autoflush --- diff --git a/CHANGES b/CHANGES index 00aac79d87..82f770949b 100644 --- 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 diff --git a/lib/sqlalchemy/orm/session.py b/lib/sqlalchemy/orm/session.py index a0f2f1f521..c98cbe6b36 100644 --- a/lib/sqlalchemy/orm/session.py +++ b/lib/sqlalchemy/orm/session.py @@ -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() diff --git a/test/orm/merge.py b/test/orm/merge.py index 2484baab60..12c16e4b11 100644 --- a/test/orm/merge.py +++ b/test/orm/merge.py @@ -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()