Alright, I see. I appreciate the quick reply and thanks for all the
work you putting in answering these questions.

-sven

On May 20, 4:45 pm, "Michael Bayer" <mike...@zzzcomputing.com> wrote:
> sven-eric wrote:
>
> > Dear List,
>
> >      I have an issue with single table inheritance and sqlalchemy
> > version 0.5.2. Specifically, I want to disable polymorphic load when
> > querying over a set of objects that are within a single-table-
> > inheritance. The normal way of using 'with_polymorphic(cls)' does not
> > seem to work properly here (the three queries at the end of the
> > provided code all return the same list of objects).
>
> >      I would be grateful if someone could read the short piece of code
> > and give me advice for how to retrieve only the 'Jon Doe' object of
> > the base class with the query. Thanks a lot.
>
> > -sven
>
> > import sqlalchemy
> > from sqlalchemy import create_engine
> > from sqlalchemy.orm import mapper, relation
> > from sqlalchemy.orm import sessionmaker
> > from sqlalchemy import Table, Column, Integer, String, MetaData,
> > ForeignKey
>
> > engine = create_engine('sqlite:///:memory:', echo=False)
> > metadata = MetaData()
>
> > class Employee(object):
> >     def __init__(self, name):
> >         self.name = name
> >     def __repr__(self):
> >         return self.__class__.__name__ + " " + self.name
>
> > class Manager(Employee):
> >     def __init__(self, name, manager_data):
> >         self.name = name
> >         self.manager_data = manager_data
> >     def __repr__(self):
> >         return self.__class__.__name__ + " " + self.name + " " +
> > self.manager_data
>
> > class Engineer(Employee):
> >     def __init__(self, name, engineer_info):
> >         self.name = name
> >         self.engineer_info = engineer_info
> >     def __repr__(self):
> >         return self.__class__.__name__ + " " + self.name + " " +
> > self.engineer_info
>
> > employees = Table('employees', metadata,
> >     Column('employee_id', Integer, primary_key=True),
> >     Column('name', String(50)),
> >     Column('type', String(30), nullable=False)
> > )
>
> > engineers = Table('engineers', metadata,
> >    Column('employee_id', Integer, ForeignKey('employees.employee_id'),
> > primary_key=True),
> >    Column('engineer_info', String(50)),
> > )
>
> > managers = Table('managers', metadata,
> >    Column('employee_id', Integer, ForeignKey('employees.employee_id'),
> > primary_key=True),
> >    Column('manager_data', String(50)),
> > )
>
> > metadata.create_all(engine)
>
> > mapper(Employee, employees, polymorphic_on=employees.c.type,
> > polymorphic_identity='employee')
> > mapper(Engineer, engineers, inherits=Employee,
> > polymorphic_identity='engineer')
> > mapper(Manager, managers, inherits=Employee,
> > polymorphic_identity='manager')
>
> > b = Employee('Jon Doe')
> > m = Manager('Jay Smith', 'Bailout Money')
> > e = Manager('Zephran Cochran', 'Hammer')
>
> > Session = sessionmaker(bind=engine)
> > session = Session()
>
> > session.add(b)
> > session.add(m)
> > session.add(e)
> > session.commit()
>
> > print session.query(Employee).all()
> > print session.query(Employee).with_polymorphic(Employee).all()
> > print session.query(Employee).with_polymorphic('*').all()
>
> this example is not using single table inheritance, it is using joined.
> with_polymrphic() is not a filter, it is an optimization for how things
> should be loaded.   The fact is that if you ask for all Employee objects,
> you will get all the Employee objects which means all the Manager and
> Engineer objects as well.  If you'd to limit to only the base class, use
> filter(Employee.type=='employee').
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalchemy@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