override innerjoin=True on an outerjoin chain

Issue #1954 resolved
Mike Bayer repo owner created an issue
from sqlalchemy import (create_engine, Table, Column, Integer, MetaData,
                       ForeignKey, Sequence, String)
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import (sessionmaker, relation, backref, joinedload_all,
                           subqueryload_all)

engine = create_engine('sqlite://', echo=True)
Session = sessionmaker(bind=engine)
session = Session()

Base = declarative_base()

class A(Base):
   __tablename__ = 'a'

   id = Column(Integer, Sequence('a_seq'), primary_key=True)
   name = Column(String)

class B(Base):
   __tablename__ = 'b'

   id = Column(Integer, Sequence('b_seq'), primary_key=True)
   a_id = Column(Integer, ForeignKey('a.id'), nullable=False)
   name = Column(String)

   a = relation(A, innerjoin=True)

class C(Base):
   __tablename__ = 'c'

   id = Column(Integer, Sequence('c_seq'), primary_key=True)
   name = Column(String)
   b_id = Column(Integer, ForeignKey('b.a_id'))

   b = relation(B)

Base.metadata.drop_all(engine)
Base.metadata.create_all(engine)

a = A(name="a")
session.add(a)
b = B(name="b", a=a)
session.add(b)

c1 = C(name="c1", b=b)
session.add(c1)
c2 = C(name="c2")
session.add(c2)

session.commit()

print "=============== No query loading hints =================="
q = session.query(C)
objects = q.all()
if len(objects) != 2:
   print "\n\n****** Unexpected number of objects: %d\n\n" % len(objects)

print "=============== Using subqueryload_all() =================="
q = session.query(C)
q = q.options(subqueryload_all('b.a'))
objects = q.all()
if len(objects) != 2:
   print "\n\n****** Unexpected number of objects: %d\n\n" % len(objects)

print "=============== Using joinedload_all() =================="
q = session.query(C)
q = q.options(joinedload_all('b.a'))
objects = q.all()
if len(objects) != 2:
   print "\n\n****** Unexpected number of objects: %d\n\n" % len(objects)

Comments (2)

  1. Log in to comment