sqlalchemy polymorhic_identity not working
I'm trying to use polymorphic_on on a python class with several inheritances:
engine = create_engine(
'mysql://xxx:yyy@localhost:3306/zzz?charset=utf8&use_unicode=0',
pool_recycle=3600, echo=True)
Base = declarative_base()
class AbstractPersistent(object):
version = Column('VERSION', Integer)
last_modified_by = Column('LAST_MODIFIED_BY', String(255))
last_modified_date = Column('LAST_MODIFIED_DATE', Date)
created_by = Column('CREATED_BY', String(255))
created_date = Column('CREATED_DATE', Date)
class AbstractNamed(AbstractPersistent):
eid = Column('ENTERPRISE_ID', String(255))
title = Column('TITLE', String(25开发者_JAVA技巧5))
description = Column('DESCRIPTION', String(255))
class AbstractContainer(AbstractNamed):
__tablename__ = 'CM_MEMBER_CONTAINER_T'
id = Column('MEMBER_CONTAINER_ID',Integer,primary_key=True)
discriminator = Column('CLASS_DISCR', String(100))
__mapper_args__ = {'polymorphic_on': discriminator }
class CourseSet(Base,AbstractContainer):
__mapper_args__ = {'polymorphic_identity': 'org.sakaiproject.coursemanagement.impl.CourseSetCmImpl'}
As you can see, CourseSet
contains all the columns of its parents and has the column CLASS_DISCR
sets to 'org.sakaiproject.coursemanagement.impl.CourseSetCmImpl'
.
But when it make a query fro all CourseSet
:
Session = sessionmaker(bind=engine)
session = Session()
course_sets = session.query(CourseSet).all()
print(course_sets)
It returns all the entries of 'CM_MEMBER_CONTAINER_T'
, but I want only the ones with CLASS_DISCR
set to 'org.sakaiproject.coursemanagement.impl.CourseSetCmImpl'
Any ideas ?
Thanks to Michael on the google group sqlalchemy, this is the answer:
AbstractContainer
is not mapped, its a mixin, so its__mapper_args__
are not used until a subclass ofBase
is invoked, which starts up a declarative mapping. Your only mapped class then isCourseSet
, which has its own__mapper_args__
, that override those ofAbstractContainer
- they are ignored.To combine
__mapper_args__
from a mapped class with those of a mixin, see the example at http://www.sqlalchemy.org/docs/orm/extensions/declarative.html?highlight=declarative#combining-table-mapper-arguments-from-multiple-mixins It uses__table_args__
but the same concept of creating a full dictionary of arguments applies for__mapper_args__
as well.
精彩评论