On Sep 27, 2010, at 5:10 PM, Julien Iguchi-Cartigny wrote:

> But How can i do ? It seems i need to define the table in
> AsbtractContainer but every time I've an error about already defined
> column.

Your original setup seems as though you'd like both CourseSet and 
CanonicalCourse to be mapped to the same table using single table inheritance.  
 Therefore they both must extend a class that is mapped to the target table.   
So in this case you'd like AbstractContainer to be mapped, meaning the "Base" 
superclass should be moved from CourseSet and CanonicalCourse onto 
AbstractContainer.

You can then query for AbstractContainer subclasses using 
session.query(AbstractContainer).


> 
> Cheers,
> 
> Julien.
> 
> On Mon, Sep 27, 2010 at 10:30 PM, Michael Bayer
> <mike...@zzzcomputing.com> wrote:
>> 
>> 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.
>> 
>> 
> 
> 
> 
> -- 
> "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.

Reply via email to