um yeah, actually this behavior is affecting all multi-level usage of  
"polymorphic_union".   So, while polymorphic_union is quite obviously  
(since nobody has noticed this pretty glaring issue) on the decline in  
the 0.5 series, this is quite severe and ill try to have a look at it  
today.

On Dec 3, 2008, at 4:06 AM, Gaetan de Menten wrote:

> Hello all,
>
> I've been playing a bit with polymorphic concrete inheritance, and
> noticed that when you have several levels of "polymorphic" loading (ie
> my child class is also a parent class which I want to load
> polymorphically), the query for the top-level class includes the child
> polymorphic join while I don't see any reason to (its table is already
> contained in the parent join). See attached example.
>
> class A(object):
>    ...
>
> class B(A):
>    pass
>
> class C(B):
>    pass
>
> The query ends up something like:
>
> SELECT [all_columns] FROM ([pjoin_abc]), ([pjoin_bc])
>
> Am I using it wrong, or is this a bug?
>
> -- 
> Gaƫtan de Menten
> http://openhex.org
>
> >
> from sqlalchemy import *
> from sqlalchemy.orm import *
>
> metadata = MetaData()
> metadata.bind = 'sqlite:///'
>
> a_table = Table('a', metadata,
>    Column('id', Integer, primary_key=True),
>    Column('data1', String(20))
> )
> b_table = Table('b', metadata,
>    Column('id', Integer, primary_key=True),
>    Column('data1', String(20)),
>    Column('data2', String(20))
> )
> c_table = Table('c', metadata,
>    Column('id', Integer, primary_key=True),
>    Column('data1', String(20)),
>    Column('data2', String(20)),
>    Column('data3', String(20))
> )
>
> metadata.create_all()
>
> class A(object):
>    def __init__(self, **kwargs):
>        for k, v in kwargs.iteritems():
>            setattr(self, k, v)
>
> class B(A):
>    pass
>
> class C(B):
>    pass
>
> pjoin_all = polymorphic_union({
>    'a': a_table,
>    'b': b_table,
>    'c': c_table
> }, 'type', 'pjoin')
>
> pjoin_bc = polymorphic_union({
>    'b': b_table,
>    'c': c_table
> }, 'type', 'pjoin_bc')
>
>
> a_m = mapper(A, a_table,
>             with_polymorphic=('*', pjoin_all),
>             polymorphic_on=pjoin_all.c.type,
>             polymorphic_identity='a')
> b_m = mapper(B, b_table,
>             inherits=a_m, concrete=True,
>             with_polymorphic=('*', pjoin_bc),
>             polymorphic_on=pjoin_bc.c.type,
>             polymorphic_identity='b')
> c_m = mapper(C, c_table,
>             inherits=b_m, concrete=True,
>             polymorphic_identity='c')
>
> Session = sessionmaker()
> session = Session()
>
> a1 = A(data1='a1')
> b1 = B(data1='b1', data2='b1')
> c1 = C(data1='c1', data2='c1', data3='c1')
>
> session.add(a1)
> session.add(b1)
> session.add(c1)
> session.commit()
>
> metadata.bind.echo = True
>
> session.query(A).all()
> print "*" * 20, "B", "*" * 20
> session.query(B).all()
>


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalchemy@googlegroups.com
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