On Sep 27, 2010, at 4:21 PM, Julien Iguchi-Cartigny wrote: > Thank you Michael. This solves the problem and... shows a new one. > > So this is my update CourseSet > > class CourseSet(Base,AbstractContainer): > > @classproperty > def __mapper_args__(self): > args = dict() > args.update(AbstractContainer.__mapper_args__) > args.update({'polymorphic_identity': > 'org.sakaiproject.coursemanagement.impl.CourseSetCmImpl'}) > return args > > Because there is several discriminant values, I need to create other ones: > > class CanonicalCourse(Base,AbstractContainer): > > @classproperty > def __mapper_args__(self): > args = dict() > args.update(AbstractContainer.__mapper_args__) > args.update({'polymorphic_identity': > 'org.sakaiproject.coursemanagement.impl.CanonicalCourseCmImpl'}) > return args > > > But this last one will fail, i've the following error message: > > sqlalchemy.exc.InvalidRequestError: Table 'CM_MEMBER_CONTAINER_T' is > already defined for this MetaData instance. Specify > 'useexisting=True' to redefine options and columns on an existing > Table object. > > I could use useexisting=True but i don't know if it's the right > solution. Any ideas ?
that has to do with a Table() statement, or alternatively how you are configuring __table_name__, neither of which are indicated here, so you need to ensure that distinct table names are used whenever a table name is declared. > > Cheers, > > Julien. > > On Mon, Sep 27, 2010 at 1:02 AM, Michael Bayer <mike...@zzzcomputing.com> > wrote: >> >> On Sep 26, 2010, at 6:38 PM, Julien Iguchi-Cartigny wrote: >> >>> Hi, >>> >>> I'm trying to use polymorphic_on with several inheritances: >>> >>> engine = create_engine( >>> 'mysql://xxx:y...@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(255)) >>> 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'} >> >> AbstractContainer is not mapped, its a mixin, so its __mapper_args__ are not >> used until a subclass of Base is invoked, which starts up a declarative >> mapping. Your only mapped class then is CourseSet, which has its own >> __mapper_args__ , that override those of AbstractContainer - 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. >> >> >> >> -- >> You received this message because you are subscribed to the Google Groups >> "sqlalchemy" group. >> To post to this group, send email to sqlalch...@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. >> >> > > > > -- > "Trouble-a-cat limited" > > -- > You received this message because you are subscribed to the Google Groups > "sqlalchemy" group. > To post to this group, send email to sqlalch...@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. > -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalch...@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.