ok, everything is working as expected....

thanks, SQLAlchemy just rocks!

2010/8/17 jean-philippe serafin <serafi...@gmail.com>

> ok, thanks for your aswers, I'll try it tonight.
>
> 2010/8/17 Michael Bayer <mike...@zzzcomputing.com>
>
>
>> On Aug 16, 2010, at 4:20 AM, jean-philippe serafin wrote:
>>
>> AbstractA is AbstractB "base" class.........
>> AbstractB is ClassA "base" class............
>>
>> Everything work fine in this case.
>>
>> I just want to set 'polymorphic_identity' on each inheritance level
>> if I set by hand : update abstract_a set class_name = 'class_a' :
>> AbstractA.query.first() give me back a ClassA object
>>
>>
>>
>> The reason you can't easily set "class_name" on the base is that you've
>> named the attribute the same thing on both AbstractA and AbstractB.  So
>> AbstractB.class_name will never affect the basemost attribute on AbstractA.
>>   If you name them differently, your constructor can ensure they are set:
>>
>>    def __init__(self, label):
>>
>>        self.label = label
>>        self.class_name_a = self.class_name_b = self.__tablename__
>>
>> But what works better, merge them on AbstractB (still remove the
>> unnecessary polymorphic_on from B, however), the value gets propagated to
>> that of AbstractB:
>>
>> class AbstractA(Base):
>>
>>    __tablename__ = "abstract_a"
>>
>>    id = Column(Integer, primary_key=True)
>>    class_name = Column('class_name', String(50))
>>
>>    __mapper_args__ = {
>>        'polymorphic_on': class_name,
>>    }
>>
>> class AbstractB(AbstractA):
>>
>>    __tablename__ = "abstract_b"
>>
>>    id = Column(Integer, ForeignKey('abstract_a.id'),primary_key=True)
>>    class_name = column_property(Column('class_name', String(50)),
>> AbstractA.__table__.c.class_name)
>>
>>    __mapper_args__ = {
>>        'polymorphic_identity': __tablename__,
>>    }
>>
>>
>> Note however, it is not possible to load a ClassA object without querying
>> at the very least "abstract_a".   So the "class_name" column of "abstract_a"
>> is always available with regular polymorphic querying.  Its redundant and
>> less normalized to have "class_name" on both tables with the same value
>>  (technically its not normalized in the first place to have a discriminator
>> column at all, though it has a dramatically positive effect on our ability
>> to locate subtypes without many outer joins).   So there's no reason I can
>> think of why you'd want class_name on B.   But even if you did, there's
>> still no reason to ever put polymorphic_on on a non-base table with the
>> current implementation, and that should still be changed to emit a warning
>> (#1880)- even here it would have alerted you to the issue.
>>
>>
>>
>>
>>
>> 2010/8/15 Michael Bayer <mike...@zzzcomputing.com>
>>
>>>
>>> On Aug 15, 2010, at 6:52 AM, jean-philippe serafin wrote:
>>>
>>> > Hi,
>>> >
>>> > I've got a class mapping with two polymorphic inheritance :
>>> >
>>> > class AbstractA(Base):
>>> >
>>> >    __tablename__ = "abstract_a"
>>> >
>>> >    id = Column(Integer, primary_key=True)
>>> >    class_name = Column('class_name', String(50))
>>> >
>>> >    __mapper_args__ = {
>>> >        'polymorphic_on': class_name,
>>> >    }
>>> >    #some stuff here
>>> >
>>> > class AbstractB(AbstractA):
>>> >
>>> >    __tablename__ = "abstract_b"
>>> >
>>> >    id = Column(Integer, ForeignKey('abstract_a.id'),
>>> > primary_key=True)
>>> >    class_name = Column('class_name', String(50))
>>> >
>>> >    __mapper_args__ = {
>>> >        'polymorphic_on': class_name,
>>> >        'polymorphic_identity': __tablename__,
>>> >    }
>>> >    #some stuff here
>>> >
>>> > class ClassA(AbstractB):
>>> >
>>> >    __tablename__ = "table_a"
>>> >    __mapper_args__ = {
>>> >        'polymorphic_identity': __tablename__,
>>> >    }
>>> >
>>> >    id = Column(Integer, ForeignKey('abstract_b.id'),
>>> > primary_key=True)
>>> >    label = Column('label', String(50))
>>> >
>>> >    def __init__(self, label):
>>> >        self.label = label
>>> >
>>> > I persist a ClassA object :
>>> >
>>> > object = ClassA('toto')
>>> > db_session.add(object)
>>> > db_session.commit()
>>> >
>>> > When I try to reload the object like this :
>>> >
>>> > reloaded_object = AbstractB.query.first()
>>> >
>>> > I get back a ClassA object (just fine)
>>> >
>>> > but when I try to reload like this :
>>> >
>>> > reloaded_object = AbstractA.query.first()
>>> >
>>> > I get back a AbstractA object because abstract_a.class_name has not
>>> > been set to polymorphic_identity.
>>> >
>>> > Is this an issue or expected work?
>>>
>>> polymorphic_on only goes on the base class.    SQLA should be changed to
>>> raise an error on the setup you have above.
>>>
>>>
>>> >
>>> > --
>>> > 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<sqlalchemy%2bunsubscr...@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<sqlalchemy%2bunsubscr...@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<sqlalchemy%2bunsubscr...@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