On 8/21/07, Michael Bayer <[EMAIL PROTECTED]> wrote:
> On Aug 21, 2007, at 6:10 PM, Patrick Wagstrom wrote:
> > Unfortunately, when creating the mapper, I can't specify an
> > onclause to the mapper. Any help on how I would accomplish this
> > and get my such a structure in SQLAlchemy?
> >
>
> the onclause for a joined table inheritance join is specified using
> the "inherit_condition" option on the inheriting mapper().
Thanks for the really quick response to my question. For the sake of
completeness and to help anyone else who may come across this problem, I've
attached a working copy of the generic graph structure to this file. I've
test it with an expanded setup which easily handles multiple levels of
inheritance.
Hope this can help someone else too.
--Patrick
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---
from sqlalchemy import *
from sqlalchemy.orm import *
metadata = MetaData('sqlite://')
element_table = Table('element', metadata,
Column('id', Integer, primary_key=True, default=None),
Column('type', CHAR(1)),
)
link_table = Table('link', metadata,
Column('id', Integer, ForeignKey('element.id'), primary_key=True),
Column('source_id', Integer, ForeignKey('element.id')),
Column('target_id', Integer, ForeignKey('element.id')),
)
metadata.create_all()
element_join = element_table.outerjoin(link_table, onclause=link_table.c.id==element_table.c.id)
class Element(object):
def __init__(self, **kwargs):
for key, value in kwargs.iteritems():
setattr(self, key, value)
def __repr__(self):
return "%s(%s)" % (self.__class__.__name__, ','.join(["%s=%s" % (k, repr(v)) for k, v in self.__dict__.iteritems() if k[0] != '_']))
class Link(Element):pass
element_mapper = mapper(Element, element_table, select_table=element_join, polymorphic_on=element_table.c.type, polymorphic_identity='e')
element_mapper.compile()
link_mapper = mapper(Link, link_table, inherits=element_mapper, inherit_condition=link_table.c.id==element_table.c.id, polymorphic_identity='l',
properties={'source': relation(Element, primaryjoin=element_table.c.id==link_table.c.source_id, uselist=False),
'target': relation(Element, primaryjoin=element_table.c.id==link_table.c.target_id, uselist=False)})
link_mapper.compile()
sess = create_session()
e1 = Element()
e2 = Element()
l = Link(source=e1, target=e2)
l2 = Link(source=e1, target=l)
for o in [e1, e2, l, l2]:
sess.save(o)
sess.flush()
sess.clear()
print sess.query(Element).list()
print sess.query(Link).list()