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 -~----------~----~----~----~------~----~------~--~---