if it's about concrete inheritance, then employee contains ALL info it needs, that is, a full copy of person + whatever else is there, and is completely independent from person table. so for that case, a) foregn key is not needed b) inserting in employee_tbl will never insert stuff in person_tbl - they are independent.
now, what u're expecting (chaining of id's and rows etc) will come from joined_table inheritance. See about that in docs; and just remove concrete=True from your mapper. Partha wrote: > I have 2 tables Person (id, name) & Employee (id, salary) and every > Employee 'isa' Person, so employee.id == person.id. I am trying to use > the Concrete Inheritance (i.e. ' pjoin) example provided in the > documentation. My mapping looks as follows. > > person_table = Table("persons", __meta__, > Column("id", Integer, primary_key=True), > Column("name", String(80)) > ) > > employee_table = Table("empys", __meta__, > Column("id", Integer, ForeignKey("persons.id"), > primary_key=True), > Column("salary", Integer), > ) > > class Person (object): pass > class Employee(Person): pass > > pjoin = polymorphic_union({ > 'person':person_table, > 'employee':employee_table > }, 'type', 'pjoin') > > > > person_mapper = mapper(Person, person_table, select_table=pjoin, \ > polymorphic_on=pjoin.c.type, > polymorphic_identity='person') > emp_mapper = mapper(Employee, employee_table, inherits=person_mapper, > \ > concrete=True, polymorphic_identity='employee') > > > > I want to now add a New employee to the system with the following > snippet. > > e = Employee() > e.name = 'TestEmpl' > e.salary = 100 > session.save(e) > session.commit() > > Problem is when it tries to save employee, sqlalchemy raises the > following error > """ > sqlalchemy.exceptions.ProgrammingError: (ProgrammingError) relation > "empys_id_seq" does not exist > 'select nextval(\'"empys_id_seq"\')' None > """ > Since all id's in employees table map directly to Person table (which > has the correct sequence), I would think alchemy would first store the > "Person" part and then store the "employee" part. Any clues on how to > correct this ??. > I also tried adding a Sequence to employee forcing it to use the same > one as person table... > > employee_table = Table("empys", __meta__, > Column("id", Integer, ForeignKey("persons.id"), > Sequence("person_id_seq") primary_key=True), > Column("salary", Integer), > ) > > > But now it raises a constraint violation because its trying to insert > a row in employees table without inserting anything in person first.. > > Any ideas how I can fix this?.. I would greatly appreciate any help in > this regard.. Thanks > > Partha > > > Here is the full program.. Thanks.. > > from sqlalchemy import create_engine, MetaData, Table, Column, types, > Sequence > from sqlalchemy import Table, Column, Integer, String, DECIMAL, > Numeric, ForeignKey, DateTime, Boolean, CHAR > from sqlalchemy.orm import mapper,sessionmaker, relation, > polymorphic_union > __meta__ = MetaData() > > person_table = Table("persons", __meta__, > Column("id", Integer, primary_key=True), > Column("name", String(80)) > ) > > employee_table = Table("empys", __meta__, > Column("id", Integer, ForeignKey("persons.id"), > primary_key=True), > Column("salary", Integer), > ) > class Person (object): pass > > class Employee(Person): pass > > pjoin = polymorphic_union({ > 'person':person_table, > 'employee':employee_table > }, 'type', 'pjoin') > > > > person_mapper = mapper(Person, person_table, select_table=pjoin, \ > polymorphic_on=pjoin.c.type, > polymorphic_identity='person') > emp_mapper = mapper(Employee, employee_table, inherits=person_mapper, > \ > concrete=True, polymorphic_identity='employee') > > > engine = create_engine('postgres:///test?user=postgres&password=foo', > echo=True) > session = sessionmaker(autoflush=True, bind = engine, > transactional=True)() > > def refresh(engine = engine): > __meta__.drop_all(engine) > __meta__.create_all(engine) > > def main(): > refresh() > e = Employee() > e.name = 'TestEmpl' > e.salary = 100 > session.save(e) > session.commit() > > if __name__ == '__main__': > main() > > > --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---