OK working, have an other problem but I will open a new thread about it.

Thank you.

Julien.

On 09/28/2010 09:20 PM, Julien Iguchi-Cartigny wrote:
> Thank you for your fast reply and bug fix. I will test this tonight.
>
> Cheers,
>
> Julien.
>
> On Tue, Sep 28, 2010 at 6:46 PM, Michael Bayer <mike...@zzzcomputing.com> 
> wrote:
>> this is a bug, ticket #1930, fixed in r36755ba72782.   Note that a similar 
>> issue exists for joined table inheritance, and a scheme like the below will 
>> continue to fail if __tablename__ is added to subclasses (this is ticket 
>> #1931).   The specific "scheme" is that the attribute name of the column in 
>> the mixin does not match the column name itself.
>>
>> http://www.sqlalchemy.org/trac/ticket/1930
>> http://www.sqlalchemy.org/trac/ticket/1931
>>
>>
>>
>> On Sep 28, 2010, at 12:06 PM, Julien Iguchi-Cartigny wrote:
>>
>>> Hello Michael,
>>>
>>> Sorry I missing something but still trap in this problem.
>>>
>>> As far as I am:
>>>
>>> class AbstractContainer(Base,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(AbstractContainer):
>>>
>>>    @classproperty
>>>    def __mapper_args__(self):
>>>        args = dict()
>>>        args.update(AbstractContainer.__mapper_args__)
>>>        args.update({'polymorphic_identity':
>>> 'org.sakaiproject.coursemanagement.impl.CourseSetCmImpl'})
>>>        return args
>>>
>>> The inheritance pass is : Course <- AbstractContainer <- AbstractNamed
>>> <- AbstractPersistence  (see my first email for the definitions of the
>>> last two classes).
>>>
>>> Still having some trouble:
>>>
>>> sqlalchemy.exc.ArgumentError: Column 'VERSION' on class <class
>>> '__main__.CourseSet'> conflicts with existing column
>>> 'CM_MEMBER_CONTAINER_T.VERSION'
>>>
>>> It I understand correctly, AbstractContainer has already mapped all
>>> columns declared in parent classes. So CourseSet tries to remap
>>> everything (it herits from Base) but it fails because all column are
>>> already mapped.
>>>
>>> So I must say something like "hey, let just reuse mapping and table
>>> definitions from AbstractContainer" but how can i do this ?
>>>
>>> It seems it is very simple from the POV of the documentation, so I
>>> must deduce the problem comes from the multiple inheritance.
>>>
>>> Cheers,
>>>
>>> Julien.
>>>
>>> PS: This is the full listing of my code:
>>>
>>> from sqlalchemy import create_engine, Column, String, Date, Integer
>>> from sqlalchemy.orm import sessionmaker
>>> from sqlalchemy.ext.declarative import declarative_base
>>> from sqlalchemy.ext.declarative import has_inherited_table
>>> from sqlalchemy.util import classproperty
>>>
>>> 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)
>>>
>>>    def __repr__(self):
>>>        return "<AbstractPersistent('%s','%s', '%s','%s','%s')>" % \
>>>            (self.version, self.last_modified_by,
>>> self.last_modified_date,
>>>            self.created_by, self.created_date)
>>>
>>> class AbstractNamed(AbstractPersistent):
>>>    eid = Column('ENTERPRISE_ID', String(255))
>>>    title = Column('TITLE', String(255))
>>>    description = Column('DESCRIPTION', String(255))
>>>
>>>    def __repr__(self):
>>>        return "<AbstractNamed('%s','%s', '%s')>" % \
>>>            (self.eid, self.title, self.description) + \
>>>                super(AbstractNamed, self).__repr__()
>>>
>>> class AbstractContainer(Base,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 AcademicSession(Base,AbstractNamed):
>>>    __tablename__ = 'CM_ACADEMIC_SESSION_T'
>>>    id = Column('ACADEMIC_SESSION_ID',Integer,primary_key=True)
>>>    start_date = Column('START_DATE', Date)
>>>    end_date = Column('END_DATE', Date)
>>>
>>>    def __repr__(self):
>>>        return "<AcademicSession('%s','%s', '%s')>" % \
>>>            (self.id, self.start_date, self.end_date) + \
>>>            super(AcademicSession, self).__repr__()
>>>
>>> class CourseSet(AbstractContainer):
>>>
>>>    @classproperty
>>>    def __mapper_args__(self):
>>>        args = dict()
>>>        args.update(AbstractContainer.__mapper_args__)
>>>        args.update({'polymorphic_identity':
>>> 'org.sakaiproject.coursemanagement.impl.CourseSetCmImpl'})
>>>        return args
>>>
>>> if __name__ == "__main__":
>>>    Session = sessionmaker(bind=engine)
>>>    session = Session()
>>>    academic_sessions = session.query(AcademicSession).all()
>>>    print(academic_sessions)
>>>    course_sets = session.query(CourseSet).all()
>>>    print(course_sets)
>>>
>>>
>>>
>>> On 27 sep, 23:55, Michael Bayer <mike...@zzzcomputing.com> wrote:
>>>> 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 
>>>>>>>> athttp://www.sqlalchemy.org/docs/orm/extensions/declarative.html?highli....
>>>>>>>>   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 
>>>>>>>> athttp://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 
>>>>>>> athttp://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 
>>>>>> athttp://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 
>>>>> athttp://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.
>>>
>> --
>> 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