> 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 [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.