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