I'm experiencing a behavior regarding the way lazy='joined' works on a
JTI setup that is not totally clear to me.  I have a basic JTI setup
as follows

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import create_engine, Column, Integer, String,
ForeignKey
from sqlalchemy.orm import sessionmaker, relationship
from sqlalchemy.orm.collections import attribute_mapped_collection

engine=create_engine('sqlite://', echo=True)
Base = declarative_base(engine)

def monkey_repr():
    def __repr__(self):
        """Show attribute values in the repr()."""
        simple_props = ', '.join('%s=%r' % (attr, value)
                                 for attr, value in
sorted(vars(self).items())
                                 if isinstance(value, (basestring,
int)))
        return '<%s (%s)>' % (type(self).__name__, simple_props)
    return __repr__

Base.__repr__ = monkey_repr()

class Company(Base):
    __tablename__ = 'companies'
    id = Column(Integer, primary_key=True)
    people = relationship('Person', lazy='joined',
 
collection_class=attribute_mapped_collection('name'))

class Person(Base):
    __tablename__ = 'people'
    id = Column(Integer, primary_key=True)
    _company_id = Column(Integer,  ForeignKey('companies.id'))
    name = Column(String)
    discriminator = Column('type', String(50))
    __mapper_args__ = {'polymorphic_on': discriminator}

class Engineer(Person):
    __tablename__ = 'engineers'
    __mapper_args__ = {'polymorphic_identity': 'engineer'}
    name = Column(String)
    department = Column(String)
    id = Column(Integer, ForeignKey('people.id'), primary_key=True)
    primary_language = Column(String(50))

class Accountant(Person):
    __tablename__ = 'accountants'
    __mapper_args__ = {'polymorphic_identity': 'accountant'}
    name = Column(String)
    bank = Column(String)
    id = Column(Integer, ForeignKey('people.id'), primary_key=True)
    primary_language = Column(String(50))

Base.metadata.create_all()

sess = sessionmaker()()

company = Company()

for p in [Engineer(name='far'),
          Person(name='nar'),
          Engineer(name='zar', department='rover'),
          Accountant(name='jak', bank='hsb')]:
    company.people.set(p)

sess.add(company)
sess.commit()
sess.expunge_all()

print "\n#\n# Query for the first company \n#\n"
c = sess.query(Company).first()
print c.people
print "\n#\n# This will issue another query even though lazy='joined'
\n#\n"
print c.people['zar'].department


Now, this makes sense if SA is only doing a joinedload on the base
Person model (because thats how the relationship is defined),  in
which case I would like to eager load all the data in the models that
extend from Person.  Am I missing something simple?

Thanks!

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

Reply via email to