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=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 [email protected]
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
-~----------~----~----~----~------~----~------~--~---