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