can i... maybe something like

        table_A = Table( 'A', meta,
            Column( 'name', String(length=200, ), ),
            Column( 'db_id',   primary_key= True,   type_= Integer, ),
        )
        table_B = Table( 'B', meta,
            Column( 'dataB', String(length=200 ),
            Column( 'db_id',   primary_key= True,   type_= Integer, ),
        )
        table_C = Table( 'C', meta,
            Column( 'name', String(length=200 ),
            Column( 'dataC', String(length=200 ),
            Column( 'db_id',   primary_key= True,   type_= Integer, ),
        )

        meta.create_all()

        class A( Base):
            props = ['db_id', 'name']
        class B( Base):
            props = ['db_id', 'dataB']
        class C( A):
            props = ['db_id', 'name', 'dataC']

        pu_a = polymorphic_union( {
                        'A': table_A,
                        'C': table_C,
                        }, 'atype', 'pu_a', ) #concrete table
        mapper_A = mapper( A, table_A,
                    polymorphic_identity= 'A',
                    polymorphic_on= pu_a.c.atype,
                    with_polymorphic= ('*', pu_a.alias( 'pu_a' )),
                    )

        mapper_B = mapper( B, table_B,
                    with_polymorphic= None,
                    )

        mapper_C = mapper( C, table_C,
                    concrete= True,
                    inherits= mapper_A,
                    polymorphic_identity= 'C',
                    with_polymorphic= None,
                    )

        #populate
        a = A()
        b = B()
        c = C()
        a.name = 'anna'
        b.dataB = 'gun'
        c.name = 'cc'
        c.dataC = 'mc'

        session = create_session()
        session.save(a)
        session.save(b)
        session.save(c)
        session.flush()

        def query_by_id( session, klas, idname, oid, ):
            #single
            if config.session_clear: session.clear()
            q = session.query( klas).filter_by( **{idname: oid})
            #TODO: filter by atype for concrete?
            m = class_mapper( klas)
            concrete = bool( m.with_polymorphic[1] )
            print 111111111111111111111111
            print m.polymorphic_on
            print m.with_polymorphic[1].c.atype
            if concrete: q= q.filter( m.polymorphic_on == 
klas.__name__)
            #if concrete: q= q.filter( m.with_polymorphic[1].c.atype 
== klas.__name__)
            return q.all()
        print query_by_id( session, A, 'db_id', 1, str(a) )

filtering by m.with_polymorphic[1].c.atype is ok (commented).

i guess i see the error: 
polymorphic_on is on pu_a, 
with_polymorphic is on pu_a.alias()...
but u have some autoaliasing in there anyway, no?


btw, have u planned to get relations to polymorphic concretes to work 
somewhen ? eventualy query.get(id) to work? i.e. identity to include 
the type


On Wednesday 03 December 2008 22:21:12 Michael Bayer wrote:
> thats strange, i dont suppose you could send me how you're setting
> up that polymorphic union
>
> On Dec 3, 2008, at 3:05 PM, [EMAIL PROTECTED] wrote:
> > and maybe related:
> > def query_by_id( klas, idname, oid, .....):
> >     q = session.query( klas).filter_by( **{idname: oid})
> >     # filter by atype for concrete
> >     m = class_mapper( klas)
> >     concrete = bool( m.with_polymorphic[1] )
> >     if concrete: q= q.filter( m.polymorphic_on == klas.__name__)
> >     return q.all()
> >
> > generates a query like
> >
> > SELECT pu_a.*
> > FROM (SELECT A.* FROM "A"
> > UNION ALL
> > SELECT C.* FROM "C")
> > AS pu_a,
> > (SELECT A.* FROM "A"
> > UNION ALL
> > SELECT C.* FROM "C")
> > AS pu_a
> > WHERE pu_a.db_id = ? AND pu_a.atype = ?
> >
> > with repeated union twice in the FROM, and error thereof.
> > Somehow the mapper.polymorphic_on is not recognized as already
> > being there and pulls the union once more?
> > if there's no q.filter( m.polymorphic_on == klas.__name__), no
> > errors (but returns multiple objects).
> >
> > this on latest trunk.
> >
> > svil
> >
> > On Wednesday 03 December 2008 19:29:31 Michael Bayer wrote:
> >> it needed some more work.  the final version of this fix is in
> >> r5412.
> >>
> >> On Dec 3, 2008, at 10:49 AM, Gaetan de Menten wrote:
> >>> On Wed, Dec 3, 2008 at 16:04, Michael Bayer
> >>>
> >>> <[EMAIL PROTECTED]> wrote:
> >>>> this ones big, i can handle it.   the attached patch makes
> >>>> your case work, but the problem represented here still makes
> >>>> itself apparent in other ways and I havent strength tested
> >>>> this patch. you might want to see if this patch works in all
> >>>> of your test cases.
> >>>
> >>> FWIW, my (only) "more complete" test involving polymorphic
> >>> concrete inheritance passes too (and produces correct SQL).
> >>> Your patch seem fine and doesn't seem to break unrelated tests.
> >>>
> >>> Thanks for the quick reaction time, as usual.
> >>> --
> >>> Gaƫtan de Menten
> >>> http://openhex.org
>
> 


--~--~---------~--~----~------------~-------~--~----~
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