From: Mike Bayer Date: Sat, 16 Jun 2012 21:41:38 +0000 (-0400) Subject: - [bug] Fixed bug whereby populate_existing X-Git-Tag: rel_0_7_8~7 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=4b555cfc2bfdb17717bc0ae7a606b29b8572eec7;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - [bug] Fixed bug whereby populate_existing option would not propagate to subquery eager loaders. [ticket:2497]. --- diff --git a/CHANGES b/CHANGES index e1148ae189..48fad18932 100644 --- a/CHANGES +++ b/CHANGES @@ -32,6 +32,10 @@ CHANGES was not accepting a scalar argument for the identity. [ticket:2508]. + - [bug] Fixed bug whereby populate_existing + option would not propagate to subquery + eager loaders. [ticket:2497]. + - sql - [bug] added BIGINT to types.__all__, BIGINT, BINARY, VARBINARY to sqlalchemy diff --git a/lib/sqlalchemy/orm/strategies.py b/lib/sqlalchemy/orm/strategies.py index 9f32cc6a66..d7d3d57ebd 100644 --- a/lib/sqlalchemy/orm/strategies.py +++ b/lib/sqlalchemy/orm/strategies.py @@ -897,6 +897,8 @@ class SubqueryLoader(AbstractRelationshipLoader): # these will fire relative to subq_path. q = q._with_current_path(subq_path) q = q._conditional_options(*orig_query._with_options) + if orig_query._populate_existing: + q._populate_existing = orig_query._populate_existing return q def _setup_outermost_orderby(self, q): diff --git a/test/orm/test_subquery_relations.py b/test/orm/test_subquery_relations.py index 70a015f29f..90df17609d 100644 --- a/test/orm/test_subquery_relations.py +++ b/test/orm/test_subquery_relations.py @@ -861,6 +861,18 @@ class LoadOnExistingTest(_fixtures.FixtureTest): self.assert_sql_count(testing.db, go, 1) assert 'addresses' not in u1.__dict__ + def test_populate_existing_propagate(self): + User, Address, sess = self._eager_config_fixture() + u1 = sess.query(User).get(8) + u1.addresses[2].email_address = "foofoo" + del u1.addresses[1] + u1 = sess.query(User).populate_existing().filter_by(id=8).one() + # collection is reverted + eq_(len(u1.addresses), 3) + + # attributes on related items reverted + eq_(u1.addresses[2].email_address, "ed@lala.com") + def test_loads_second_level_collection_to_scalar(self): User, Address, Dingaling, sess = self._collection_to_scalar_fixture()