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