Yeah, I didn't include the whole Content mapper, here are the
polymorphic params for that mapper:
polymorphic_on=content_table.c.type, polymorphic_identity='content'
And ContentLeaf:
mapper(ContentLeaf, content_leaf,
properties = {
'_copyright': content_leaf.c.copyright,'copyright' :
synonym('_copyright'),
'_grid ': content_leaf.c.grid,'grid' :
synonym('_grid'),
'_gtin' : content_leaf.c.gtin,'gtin' :
synonym('_gtin'),
'_iswc' : content_leaf.c.iswc,'iswc' :
synonym('_iswc'),
'_isan' : content_leaf.c.isan,'isan' :
synonym('_isan'),
'_isrc' : content_leaf.c.isrc,'isrc' :
synonym('_isrc'),
'_reviewed' : content_leaf.c.reviewed,'reviewed' :
synonym('_reviewed'),
'_flagged' : content_leaf.c.flagged,'flagged' :
synonym('_flagged'),
'_ingestion_type':
content_leaf.c.ingestion_type,'ingestion_type' :
synonym('_ingestion_type'),
},
inherits = cm,
polymorphic_on = content_table.c.type,
polymorphic_identity ='leaf')
So, loading polymorphically is working for me.
So maybe I can do something like:
q =
Session.query(Content).add_entity(Account).select_from(content_table.outerjoin(accounts))
To get the account?
thx
m
On Dec 30, 2:53 pm, Michael Bayer <[EMAIL PROTECTED]> wrote:
> On Dec 30, 2007, at 3:20 PM, Matt wrote:
>
>
>
> > Hi all,
>
> > I'm having an issue where I'm doing a query that I want to be loaded
> > all in one select to the database. I have a table "ContentLeaf" which
> > inherits from "Content", I can get the ContentLeaf fields to eagerload
> > by using select_table in the mapper:
>
> > myjoin = content_table.outerjoin(content_leaf)
> > cm = mapper(Content, content_table,
> > select_table = myjoin,
> > properties = {
> > 'account' : relation(Account, cascade='all',
> > lazy=False),
>
> I dont really understand what the desired behavior is here, unless you
> are trying to load polymorphically - but I dont see any "polymorphic"
> attributes on this mapper, so that won't work.
>
> the mapper for Content will map attributes to each column in the
> "content_table" table. when you specify
> select_table=content_table.join(someothertable), the columns in
> (someothertable) will be present in the result rows returned by the
> database, but will have no impact whatsoever on the data which is
> fetched from each row, since as far as I can tell nothing is mapped to
> the "content_leaf" table. if content_leaf is mapped to some other
> class, the Content mapper above still does not have any polymorphic
> attributes configured so its still not going to have any effect on
> what gets returned. so the "select_table" argument is really
> meaningless when used with a mapper that has no polymorphic options
> configured. if you need to load more than one kind of object from a
> select or a join, theres other ways to do that, discussed below.
>
>
>
> > Here I also define the account property to eagerload by specifying
> > lazy=False. In this case, only the ContentLeaf eagerloads and I see
> > this in the debug logs:
>
> So heres the next side effect of "select_table" - which is that eager
> loading relations are not currently get included when you load from a
> select_table. Usually, select_table is used for a polymorphic "all at
> once" load of a hierarchy of classes, so the joins issued are already
> fairly complex. We will eventually have select_table loads include
> the eagerloading of relations attached to the base mapper, possibly in
> 0.4.3. But in this case i dont think select_table is what youre
> looking for unless theres some other detail missing here.
>
>
>
> > If I remove the select_table, the account property will then
> > eagerload, but I really want both to eagerload in the same query. Any
> > ideas on how to make this happen?
>
> So, im assuming that you have some other class mapped to
> content_leaf. Depending on how you have your ContentLeaf (or
> whatever its called) class related to Content would determine what to
> use. Theres four general patterns you might use. one is inheritance:
>
> mapper(Content, content_table,
> polymorphic_on=content_table.c.type, polymorphic_identity='content')
> mapper(ContentLeaf, content_leaf, inherits=Content,
> polymorphic_identity='content_leaf')
>
> another is eagerloading relation():
>
> mapper(Content, content_table, properties={
> 'leafs':relation(ContentLeaf, lazy=False),
> 'account':relation(Account, lazy=False)
> })
>
> or you'd just like an ad-hoc join that loads both - this might be what
> youre looking for in this case:
>
> results =
> session
> .query
> (Content
> ).add_entity
> (ContentLeaf).select_from(content_table.outerjoin(content_leaf)).all()
>
> the "results" would be a list of tuples in the form (Content(),
> ContentLeaf()). with the above query the eager load from "Content" to
> "account" should work as well...if not, use the trunk which will be
> released as 0.4.2 in the next few days since we've made some
> improvements to this area.
>
> Theres also the possibility that you just want Content mapped to both
> tables; thats doable as well, except you still wouldnt use
> select_table, you'd just map to the join directly:
>
> mapper(Content, content_table.outerjoin(content_leaf),
> properties={...})
>
> so if you still cant fit your use case here, provide a more detailed
> example of what your classes look like and how youd like them mapped
> to each table.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To post to this group, send email to [email protected]
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
-~----------~----~----~----~------~----~------~--~---