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 ?

Cheers,

Julien.

On Mon, Sep 27, 2010 at 1:02 AM, Michael Bayer <[email protected]> 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 [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.
>
>



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

Reply via email to