summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2007-11-14 16:59:49 +0000
committerMike Bayer <mike_mp@zzzcomputing.com>2007-11-14 16:59:49 +0000
commit64b7a0cd6e06b03fd8186d50dc9b9945d7fb2695 (patch)
tree77af5b1169f9afe7f15459e3fff172d9495fb5eb
parenta03aa84c31bee4c13a32612109c79e86a2afcd53 (diff)
downloadsqlalchemy-64b7a0cd6e06b03fd8186d50dc9b9945d7fb2695.tar.gz
modified last commit; the eager loader only undefers columns from the primary mapped table.
-rw-r--r--lib/sqlalchemy/orm/strategies.py2
-rw-r--r--test/orm/eager_relations.py28
-rw-r--r--test/testlib/fixtures.py11
3 files changed, 37 insertions, 4 deletions
diff --git a/lib/sqlalchemy/orm/strategies.py b/lib/sqlalchemy/orm/strategies.py
index 0d2d751f0..8574d2fef 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 858f139ba..e5d1e853c 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 6baf16bf0..9105a2937 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),