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

Reply via email to