On Jan 24, 2008, at 3:55 PM, Michael Bayer wrote:

>
> as we've said, many times, its not appropriate for SQLAlchemy to
> *guess* which particular subclass might have the "site_client"
> attribute you're looking for.  if you would just set up "select_table"
> on your mapper, this whole issue goes away.
>
>>
>> .filter(Site.c.id==site_client_table.c.id)
>>
>> That join(['site', 'playlists', ('someprop', table.join(subtable)),
>> MySubclass.someprop]) you've proposed feels ugly.
>

>> Player.join(['site', 'site_client', 'playlists']).filter(...)
>
> then set up "select_table".

in other words:

from sqlalchemy import *
from sqlalchemy.orm import *

def id():return Column('id', Integer, primary_key=True)
def data(name=None):return Column(name or 'data', String(50))
def fk(table):return Column("%s_id" % table, Integer,  
ForeignKey("%s.id" % table))

engine = create_engine('sqlite://', echo=True)
meta = MetaData(engine)

players =Table('players', meta, id(), data(), fk('sites'))
sites =Table('sites', meta, id(), data(), data('type'))
site_clients = Table('site_clients', meta, Column('id', Integer,  
ForeignKey('sites.id'), primary_key=True), data('site_client_data'))
playlists = Table('playlists', meta, id(), data(), fk('site_clients'))

meta.create_all()

class Base(object):
     def __init__(self, **kwargs):
         for k in kwargs:
             setattr(self, k, kwargs[k])

     def __repr__(self):
         return "%s(%s)" % (
             (self.__class__.__name__),
             ','.join(["%s=%s" % (key, repr(getattr(self, key))) for  
key in self.__dict__ if not key.startswith('_')])
         )

class Player(Base):
     pass
class Site(Base):
     pass
class SiteClient(Site):
     pass
class PlayList(Base):
     pass

mapper(Player, players, properties={
     'site':relation(Site)
})
mapper(Site, sites, select_table=sites.join(site_clients),  
polymorphic_on=sites.c.type, polymorphic_identity='site')
mapper(SiteClient, site_clients, inherits=Site,  
polymorphic_identity='client', properties={
     'playlists':relation(PlayList)
})
mapper(PlayList, playlists)

sess = create_session()

p1 = Player(data='player #1',
     site=SiteClient(data='site client #1', playlists=[
         PlayList(data="playlist1"),
         PlayList(data="playlist2"),
         PlayList(data="playlist3"),
     ])
)
p2 = Player(data='player #2',
     site=Site(data='somesite')
)
p3 = Player(data='player #3',
     site=SiteClient(data='side client #2', playlists=[
         PlayList(data="playlist4"),
         PlayList(data="playlist5"),
         PlayList(data="playlist6"),
     ])
)
for p in [p1, p2, p3]:
     sess.save(p)
sess.flush()
sess.clear()

assert sess.query(Player).join(['site',  
SiteClient.playlists]).filter(PlayList.data=='playlist5').one().data  
== "player #3"




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