Hello

I am wondering why the outputs q1 and q2 below are not the same. Is it a 
bug?
 

from sqlalchemy import *
from sqlalchemy.orm import *
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

_relation_a_table = Table('relation_a', Base.metadata,
        Column('id', Integer, primary_key=True),
        Column('refno', Integer)
    )

_relation_b_table = Table('relation_b', Base.metadata,
        Column('id', Integer, primary_key=True),
        ForeignKeyConstraint(['id'], ['relation_a.id'])
    )

_relation_c_table = Table('relation_c', Base.metadata,
        Column('id', Integer, primary_key=True),
        ForeignKeyConstraint(['id'], ['relation_b.id'])
    )

class RelationA(Base):
    __table__ = _relation_a_table

class RelationB(Base):
    __table__ = _relation_b_table

    relation_a = relationship('RelationA',
                innerjoin=True,
                backref=backref('relation_b'))

class RelationC(Base):
    __table__ = _relation_c_table

    relation_b = relationship('RelationB',
                innerjoin=True,
                backref=backref('relation_c',
                    innerjoin=True,
                    lazy='joined'))

if __name__ == '__main__':

    # Initialize database models
    engine = create_engine('postgresql://xxx@localhost:5432/xxx')
    Session = sessionmaker(bind=engine)
    session = Session()

    q1 = session.query(RelationA).\
        options(joinedload(RelationA.relation_b))

    q2 = session.query(RelationA).\
        outerjoin(RelationA.relation_b).\
        options(contains_eager(RelationA.relation_b))

    print q1
    print q2

#    Actual and expected SQL output for q1:

#    SELECT
#        relation_a.id AS relation_a_id,
#        relation_a.refno AS relation_a_refno,
#        relation_b_1.id AS relation_b_1_id,
#        relation_c_1.id AS relation_c_1_id
#    FROM relation_a
#    LEFT OUTER JOIN relation_b AS relation_b_1 ON relation_a.id = 
relation_b_1.id
#    LEFT OUTER JOIN relation_c AS relation_c_1 ON relation_b_1.id = 
relation_c_1.id

#    Actual SQL output for q2 (with JOIN):

#    SELECT
#        relation_a.id AS relation_a_id,
#        relation_a.refno AS relation_a_refno,
#        relation_b.id AS relation_b_id,
#        relation_c_1.id AS relation_c_1_id
#    FROM relation_a
#    LEFT OUTER JOIN relation_b ON relation_a.id = relation_b.id
#    JOIN relation_c AS relation_c_1 ON relation_b.id = relation_c_1.id

#    Expected SQL output for q2 (with LEFT OUTER JOIN):

#    SELECT
#        relation_a.id AS relation_a_id,
#        relation_a.refno AS relation_a_refno,
#        relation_b.id AS relation_b_id,
#        relation_c_1.id AS relation_c_1_id
#    FROM relation_a
#    LEFT OUTER JOIN relation_b ON relation_a.id = relation_b.id
#    LEFT OUTER JOIN relation_c AS relation_c_1 ON relation_b.id = 
relation_c_1.id


-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sqlalchemy+unsubscr...@googlegroups.com.
To post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at http://groups.google.com/group/sqlalchemy?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to