[sqlalchemy] Re: Concrete Inheritance problem
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=postgrespassword=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 -~--~~~~--~~--~--~---
[sqlalchemy] Re: Concrete Inheritance problem
Thank you! . That worked great.. Partha On Nov 19, 2:41 pm, [EMAIL PROTECTED] wrote: 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=postgrespassword=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 -~--~~~~--~~--~--~---