Hi there,
I have been using sqlalchemy for the past month with great success.
However, recently I came across an unexpected situation. Essentially
the results I was retrieving from the database via an ORM query were
not including all the related attributes despite indicating eager
loading on the mapper using lazy=False.
I have created an example script (below) to highlight the results I
was getting. Note that after a bit of reading I discovered I could use
contains_eager() on the query to obtain the correct result, but I am
not sure if indeed this is the correct solution or if there is a flaw
in my setup/understanding of the system.
As I see it from the SQL the first query is placing a limit 1 at the
end of the full statement rather than as part of a subselect causing
only 1 Tag to be retrieved with the Employee rather than the expected
2.
ta,
Martin
p.s. Apologies if the code displays badly - is there a format
indicator?
===================================================================
from sqlalchemy import *
from sqlalchemy.orm import *
engine = create_engine('sqlite:////tmp/example.db', echo=True)
metadata = MetaData()
Session = scoped_session(sessionmaker(autoflush=True,
transactional=True, bind=engine))
mapper = Session.mapper
# Person
#----------------------------------------------
class Person(object):
def __init__(self):
self.id = None
class Employee(Person):
def __init__(self, name='bob'):
self.name = name
class Tag(object):
def __init__(self, label):
self.id = None
self.label = label
# Setup tables
#----------------------------------------------
people = Table('people', metadata,
Column('id', Integer, primary_key=True),
Column('_type', String(30), nullable=False),
)
employees = Table('employees', metadata,
Column('id', Integer, ForeignKey('people.id'),
primary_key=True),
)
tags = Table('tags', metadata,
Column('id', Integer, primary_key=True),
Column('label', String, nullable=False),
)
peopleTags = Table('peopleTags', metadata,
Column('person_id', Integer,
ForeignKey('people.id')),
Column('tag_id', Integer,
ForeignKey('tags.id')),
)
# Mappers
#----------------------------------------------
mapper(Person, people, polymorphic_on=people.c._type,
polymorphic_identity='person')
mapper(Employee, employees, inherits=Person,
polymorphic_identity='employee')
mapper(Tag, tags)
_mapper = class_mapper(Person)
_table = _mapper.local_table
_mapper.add_property('tags', relation(Tag, secondary=peopleTags,
backref='people', lazy=False))
metadata.create_all(engine)
# Test
#----------------------------------------------
session = Session()
bob = Employee()
session.save(bob)
tag = Tag('crazy')
session.save(tag)
bob.tags.append(tag)
tag = Tag('funny')
session.save(tag)
bob.tags.append(tag)
session.commit()
session.clear()
instance = session.query(Employee).filter_by(id=1).first()
print instance, instance.tags
session.clear()
instance =
session.query(Employee).options(contains_eager('tags')).filter_by(id=1).first()
print instance, instance.tags
Session.remove()
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/sqlalchemy?hl=en
-~----------~----~----~----~------~----~------~--~---