Hi,

I have a self-referential table 'hierarchy' which has a 1:N relationship with a view 'arbeitsmittelhierarchy_arbeitsmittel_view'. They are defined as follows:

   # generate a mapper of the self-referential table 'hierarchy'
   HierarchyTable = Table('hierarchy', metadata,
Column('parentid', Integer, ForeignKey('hierarchy.id')),
                          autoload=True)

   AMH_View = Table('arbeitsmittelhierarchy_arbeitsmittel_view', metadata,
                     autoload=True)

arbeitsmittelhierarchy_arbeitsmittel_view.idhierarchy references
hierarchy.id

The mapper code is:

   class HierarchyNode(MappedClassBase):
        pass


   mapper(HierarchyNode, HierarchyTable, properties={
       'children' : relation(
                       HierarchyNode,

primaryjoin=and_(HierarchyTable.c.parentid==HierarchyTable.c.id, HierarchyTable.c.deleted==False),
                       cascade="all",
backref=backref("parent", remote_side=[HierarchyTable.c.id])
                    ),
       'parent' : relation(
                       HierarchyNode,

primaryjoin=HierarchyTable.c.parentid==HierarchyTable.c.id,
                       remote_side=[HierarchyTable.c.id],
                       uselist=False,
                    ),
       'tools' : relation(
                       HierarchyNode,

primaryjoin=AMH_View.c.idhierarchy==HierarchyTable.c.id,
                       foreign_keys=[AMH_View.c.idhierarchy],
                       uselist=True,
                    ),
       }
   )

The 'children' and 'parent' properties work like a charm however
when accessing 'tools' the generated query is slow because
it generates something like:

select .... from hierarchy, arbeitsmittelhierarchy_arbeitsmittel_view
where arbeitsmittelhierarchy_arbeitsmittel_view  = some_id

Because both tables are big the query takes forever. Using a LEFT JOIN
would definitely be faster. Is there a way to configure the 'tools'
property in a smarter way?

Andreas

Attachment: pgpj2HJErEYRa.pgp
Description: PGP signature

Reply via email to