I'm trying to use assign_mapper with polymorphic multiple table
inheritance, and running into problems with the primary key sequencing.
 Is this a supported use of sqlalchemy?  I'm running version 0.3.1.

Sample code below.  If use_assign_mapper is false, then the script
works with both postgres & sqlite.  If it's true, then sqlite fails on
the assertion that the manager & employee id's be different, and
postgres throws an exception that 'managers_person_id_seq" does not
exist'

Thanks in advance for any help, and thanks for an otherwise awesome
product!
-Ken


#!/usr/bin/env python
# The setup here is identical to the example at:
#
http://sqlalchemy.org/docs/adv_datamapping.myt#advdatamapping_inheritance_multiple
# Except that it conditionally uses assignmapper instead of the default
mapper
from sqlalchemy import *
from sqlalchemy.ext.assignmapper import assign_mapper
from sqlalchemy.ext.sessioncontext import SessionContext

use_postgres = False
use_assign_mapper = True

if not use_postgres:
    url = 'sqlite:///:memory:'
else:
    url="postgres://ken:[EMAIL PROTECTED]/tutorial"

engine = create_engine(url)
metadata = BoundMetaData(engine)
context = SessionContext(create_session)

employees = Table('employees', metadata,
   Column('person_id', Integer, primary_key=True),
   Column('name', String(50)),
   Column('type', String(30)))

engineers = Table('engineers', metadata,
   Column('person_id', Integer, ForeignKey('employees.person_id'),
primary_key=True),
   Column('engineer_info', String(50)),
  )

managers = Table('managers', metadata,
   Column('person_id', Integer, ForeignKey('employees.person_id'),
primary_key=True),
   Column('manager_data', String(50)),
   )

class Employee(object):
    pass
class Engineer(Employee):
    pass
class Manager(Employee):
    pass

person_join = polymorphic_union(
    {   'engineer':employees.join(engineers),
        'manager':employees.join(managers),
        'person':employees.select(employees.c.type=='person'),
    }, None, 'pjoin')

metadata.create_all()

#######################################
if not use_assign_mapper:
    #This works:
    person_mapper = mapper(Employee, employees,
select_table=person_join,
                       polymorphic_on=person_join.c.type,
polymorphic_identity='person')
    mapper(Engineer, engineers, inherits=person_mapper,
polymorphic_identity='engineer')
    mapper(Manager, managers, inherits=person_mapper,
polymorphic_identity='manager')
else:
    #This doesn't
    person_mapper = assign_mapper(context, Employee, employees,
select_table=person_join,
                       polymorphic_on=person_join.c.type,
polymorphic_identity='person')
    assign_mapper(context, Engineer, engineers, inherits=person_mapper,
polymorphic_identity='engineer')
    assign_mapper(context, Manager, managers, inherits=person_mapper,
polymorphic_identity='manager')

context.current.echo_uow=True

eng = Engineer()
mgr = Manager()
context.current.save(eng)
context.current.save(mgr)
context.current.flush()

print "eng: %d mgr: %d" % (eng.person_id, mgr.person_id)
assert(eng.person_id != mgr.person_id)


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