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