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()

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