seems like a bug whereby when it sees the "Manager" single table inheritor, it somehow doesn't get the message to synchronize the "Employee" primary key column with the Person primary key column. I'll have a look at it later today.
On May 9, 2008, at 7:49 PM, Fernando Zunino wrote: > > Hi, > is it possible to combine joined and single table inheritance in the > same inheritance hierarchy? > > In the code at the bottom I want to use the persons table as a base > for the Person, Employee and Manager classes and the employees table > to store the particular fields of Employee and Manager. > > I've run this code using PostgreSql and it correctly flushes the > Person and Employee instances but when it wants to flush the Manager > instance gives the following error: > > /home/fernando/.pythonrepo/SQLAlchemy-0.4.5-py2.5.egg/sqlalchemy/ > engine/base.py in _handle_dbapi_exception(self, e, statement, > parameters, cursor) > 940 if self.__close_with_result: > 941 self.close() > --> 942 raise exceptions.DBAPIError.instance(statement, > parameters, e, connection_invalidated=is_disconnect) > 943 finally: > 944 del self._reentrant_error > > <class 'sqlalchemy.exceptions.ProgrammingError'>: (ProgrammingError) > relation "employees_person_id_seq" does not exist > 'select nextval(\'"employees_person_id_seq"\')' None > > Anyone have any suggestions? > > thanks, > Fernando > > > class Person(object): > def __init__(self, name): > self.name = name > def __repr__(self): > return self.__class__.__name__ + " " + self.name > > class Employee(Person): > def __init__(self, name, employee_data): > self.name = name > self.employee_data = employee_data > > def __repr__(self): > return self.__class__.__name__ + " " + self.name + " " + > self.employee_data > > class Manager(Employee): > def __init__(self, name, employee_data, manager_data): > self.name = name > self.employee_data = employee_data > self.manager_data = manager_data > > def __repr__(self): > return self.__class__.__name__ + " " + self.name + " " + > self.manager_data > > persons_table = Table('persons', metadata, > Column('person_id', Integer, primary_key=True), > Column('name', String(50)), > Column('type', String(20), nullable=False) > ) > > employees_table = Table('employees', metadata, > Column('person_id', Integer, ForeignKey('persons.person_id'), > primary_key=True), > Column('employee_data', String(50)), > Column('manager_data', String(50)), > ) > > person_mapper = mapper(Person, persons_table, \ > polymorphic_on=persons_table.c.type, > polymorphic_identity='person') > employee_mapper = mapper(Employee, employees_table, inherits=Person, > polymorphic_identity='engineer') > manager_mapper = mapper(Manager, inherits=employee_mapper, > polymorphic_identity='manager') > > metadata.create_all(engine); > Session = scoped_session(sessionmaker(bind=engine, autoflush=True, > transactional=True)) > session = Session(); > > session.save(Person('fer')) > session.save(Employee('e', 'e1')) > session.save(Manager('m', 'e2', 'm1')) > session.flush() > > > > > --~--~---------~--~----~------------~-------~--~----~ 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 [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en -~----------~----~----~----~------~----~------~--~---