]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
modified last commit; the eager loader only undefers columns from the primary mapped...
authorMike Bayer <mike_mp@zzzcomputing.com>
Wed, 14 Nov 2007 16:59:49 +0000 (16:59 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Wed, 14 Nov 2007 16:59:49 +0000 (16:59 +0000)
lib/sqlalchemy/orm/strategies.py
test/orm/eager_relations.py
test/testlib/fixtures.py

index 0d2d751f05b288d3936d9125e92dba76e48b97ec..8574d2fef22b883e6aa77586efb6c726e275ccf5 100644 (file)
@@ -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()
index 858f139ba8efd1a758bf92da855228600aec2663..e5d1e853ce21307ac8db6dd8ab8c7d45f966ae4a 100644 (file)
@@ -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):
 
index 6baf16bf07c7317f34b4718138a6aea3fa7887ad..9105a29378f1a5225c15f0b467eb699fc8272db2 100644 (file)
@@ -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),