> However in my case I don't want to be able to persist some random Employee. 
> All my employees should be engineers or managers. Ideally some exception 
> should be thrown if I try to add an Employee object to my session.

Maybe something like this. But I'm not sure if it's the right way. It fails on 
flush.

from sqlalchemy.engine import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import *
from sqlalchemy.orm import *
from sqlalchemy.schema import Column, MetaData, ForeignKey
from sqlalchemy.types import Integer

engine = create_engine('sqlite://')
meta = MetaData(bind=engine)
Session = sessionmaker(bind=engine)
Base = declarative_base(metadata=meta)

class EmployeeChecker(MapperExtension):
    def before_insert(self, mapper, connection, target):
        if type(target) != Employee:
            raise Exception('Inserting of Employee is not supported')

class Employee(Base):
    __tablename__ = 'employee'

    id = Column(Integer, primary_key=True)

    name = Column(String)

    discriminator = Column('type', String(50))
    __mapper_args__ = {'polymorphic_on': discriminator, 'extension' : 
EmployeeChecker()}

class Manager(Employee):
    __tablename__ = 'manager'
    __mapper_args__ = {'polymorphic_identity' : 'manager'}

    id = Column(Integer, ForeignKey('employee.id'), primary_key=True)


meta.drop_all()
meta.create_all()

session = Session()
session.add(Employee())
session.add(Manager())
session.commit()

e = session.query(Employee).one()
e.name='test'
session.add(e)
session.commit()


-- 
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 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

Reply via email to