From 64b7a0cd6e06b03fd8186d50dc9b9945d7fb2695 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Wed, 14 Nov 2007 16:59:49 +0000 Subject: [PATCH] modified last commit; the eager loader only undefers columns from the primary mapped table. --- lib/sqlalchemy/orm/strategies.py | 2 -- test/orm/eager_relations.py | 28 ++++++++++++++++++++++++++-- test/testlib/fixtures.py | 11 +++++++++++ 3 files changed, 37 insertions(+), 4 deletions(-) diff --git a/lib/sqlalchemy/orm/strategies.py b/lib/sqlalchemy/orm/strategies.py index 0d2d751f05..8574d2fef2 100644 --- a/lib/sqlalchemy/orm/strategies.py +++ b/lib/sqlalchemy/orm/strategies.py @@ -547,8 +547,6 @@ class EagerLoader(AbstractRelationLoader): for col in sql_util.find_columns(clauses.primaryjoin): if localparent.mapped_table.c.contains_column(col): context.primary_columns.append(col) - else: - context.secondary_columns.append(col) if self.order_by is False and clauses.alias.default_order_by() is not None: context.eager_order_by += clauses.alias.default_order_by() diff --git a/test/orm/eager_relations.py b/test/orm/eager_relations.py index 858f139ba8..e5d1e853ce 100644 --- a/test/orm/eager_relations.py +++ b/test/orm/eager_relations.py @@ -153,9 +153,33 @@ class EagerTest(QueryTest): }) mapper(User, users, properties={'addresses':relation(Address, lazy=False)}) - assert [User(id=7, addresses=[Address(id=1)])] == create_session().query(User).filter(User.id==7).options(eagerload('addresses')).all() + assert [User(id=7, addresses=[Address(id=1)])] == create_session().query(User).filter(User.id==7).all() - assert [User(id=7, addresses=[Address(id=1)])] == create_session().query(User).limit(1).filter(User.id==7).options(eagerload('addresses')).all() + assert [User(id=7, addresses=[Address(id=1)])] == create_session().query(User).limit(1).filter(User.id==7).all() + + sess = create_session() + u = sess.query(User).get(7) + def go(): + assert u.addresses[0].user_id==7 + # assert that the eager loader didn't have to affect 'user_id' here + # and that its still deferred + self.assert_sql_count(testbase.db, go, 1) + + clear_mappers() + + mapper(User, users, properties={'addresses':relation(Address, lazy=False)}) + mapper(Address, addresses, properties={ + 'user_id':deferred(addresses.c.user_id), + 'dingalings':relation(Dingaling, lazy=False) + }) + mapper(Dingaling, dingalings, properties={ + 'address_id':deferred(dingalings.c.address_id) + }) + sess = create_session() + def go(): + u = sess.query(User).limit(1).get(8) + assert User(id=8, addresses=[Address(id=2, dingalings=[Dingaling(id=1)]), Address(id=3), Address(id=4)]) == u + self.assert_sql_count(testbase.db, go, 1) def test_many_to_many(self): diff --git a/test/testlib/fixtures.py b/test/testlib/fixtures.py index 6baf16bf07..9105a29378 100644 --- a/test/testlib/fixtures.py +++ b/test/testlib/fixtures.py @@ -69,6 +69,7 @@ class Order(Base):pass class Item(Base):pass class Keyword(Base):pass class Address(Base):pass +class Dingaling(Base):pass metadata = MetaData() @@ -89,6 +90,12 @@ addresses = Table('addresses', metadata, Column('user_id', None, ForeignKey('users.id')), Column('email_address', String(50), nullable=False)) +dingalings = Table("dingalings", metadata, + Column('id', Integer, primary_key=True), + Column('address_id', None, ForeignKey('addresses.id')), + Column('data', String(30)) + ) + items = Table('items', metadata, Column('id', Integer, primary_key=True), Column('description', String(30), nullable=False) @@ -122,6 +129,10 @@ def install_fixture_data(): dict(id = 4, user_id = 8, email_address = "ed@lala.com"), dict(id = 5, user_id = 9, email_address = "fred@fred.com"), ) + dingalings.insert().execute( + dict(id=1, address_id=2, data='ding 1/2'), + dict(id=2, address_id=5, data='ding 2/5'), + ) orders.insert().execute( dict(id = 1, user_id = 7, description = 'order 1', isopen=0, address_id=1), dict(id = 2, user_id = 9, description = 'order 2', isopen=0, address_id=4), -- 2.47.2