Yeah, I kinda figured that out in a round-about way, because 0.5rc2 and 0.4.8 would get me my object, but then node.Parent was the collection of children. Thanks for the response. Michael Bayer wrote: > Hi David - > > One thing I notice is that your "remote_side" on the self referential > relation from TypeNode->Children is not needed, whereas it *is* needed > on the TypeNode->Parent side, which is the many to one side, using > backref=backref('Parent', remote_side=[typehierarchy_table.c.id]). > Without it, SQLA assumes TypeNode->Parent is a one to many collection. > > However, I cannot reproduce your behavior - if the remote_side is in > fact missing on the backref side, the comparison of > TypeNode.Parent==something correctly raises this error: > sqlalchemy.exc.InvalidRequestError: Can't compare a collection to an > object or collection; use contains() to test for membership. > > Here is a test case illustrating the current 0.5rc3 behavior - you can > see that a many-to-one self referential comparison does not generate > an EXISTS anymore: > > from sqlalchemy import * > from sqlalchemy.orm import * > > metadata = MetaData() > > nodes = Table('nodes', metadata, > Column('id', Integer, primary_key=True), > Column('parent_id', Integer, ForeignKey('nodes.id')) > ) > > class Node(object): > def __init__(self, **kw): > for k in kw: > setattr(self, k, kw[k]) > > mapper(Node, nodes, properties={ > 'Children':relation(Node, backref=backref('Parent', > remote_side=nodes.c.id)) > }) > > print > create_session().query(Node).filter(Node.Parent==Node(id=2)).statement > > output: > > SELECT nodes.id, nodes.parent_id > FROM nodes > WHERE :param_1 = nodes.parent_id > > > > > On Nov 10, 2008, at 3:36 PM, David Gardner wrote: > > >> Had a problem this morning where SA 0.5rc3 was returning None, while >> 0.5rc2 and 0.4.8 returned the expected object/row. >> >> tables & mappers: >> ---------------------------------- >> typehierarchy_table = Table('typehierarchy', metadata, autoload=True) >> typehierarchy_names_table = Table('typehierarchy_names', metadata, >> autoload=True) >> mapper(TypeNode, typehierarchy_table, properties={ >> 'AutoPopNames':relation(TypeAutoPop, backref='TypeNode'), >> 'Children':relation(TypeNode, >> primaryjoin=(typehierarchy_table.c.id==typehierarchy_table.c.parent), >> >> remote_side=[typehierarchy_table.c.parent],backref='Parent')}, >> save_on_init=False) >> >> mapper(TypeAutoPop,typehierarchy_names_table, save_on_init=False) >> >> >> 0.5.0rc3: >> ---------------- >> >>>>> from assetdb import * >>>>> >> DEV BRANCH:assetdb.py >> >>>>> print sqlalchemy.__version__ >>>>> >> 0.5.0rc3 >> >>>>> session=create_session() >>>>> t='h2_prj' >>>>> show='sid' >>>>> parent=None >>>>> db.echo=True >>>>> tn = >>>>> >> session >> .query >> (TypeNode >> ).filter >> (TypeNode >> .Parent >> = >> =parent).filter(TypeNode.type==t).filter(TypeNode.project==show).all() >> 2008-11-10 12:19:06,534 INFO sqlalchemy.engine.base.Engine.0x...af50 >> SELECT typehierarchy.project AS typehierarchy_project, >> typehierarchy.parent AS typehierarchy_parent, typehierarchy.id AS >> typehierarchy_id, typehierarchy.type AS typehierarchy_type, >> typehierarchy.static AS typehierarchy_static >> FROM typehierarchy >> WHERE NOT (EXISTS (SELECT 1 >> FROM typehierarchy AS typehierarchy_1 >> WHERE typehierarchy.id = typehierarchy_1.parent)) AND >> typehierarchy.type >> = %(type_1)s AND typehierarchy.project = %(project_1)s >> 2008-11-10 12:19:06,535 INFO sqlalchemy.engine.base.Engine.0x...af50 >> {'type_1': 'h2_prj', 'project_1': 'sid'} >> >>>>> tn >>>>> >> [] >> >> 0.5.0rc2: >> ---------------- >> >>>>> from assetdb import * >>>>> >> DEV BRANCH:assetdb.py >> >>>>> print sqlalchemy.__version__ >>>>> >> 0.5.0rc2 >> >>>>> session=create_session() >>>>> t='h2_prj' >>>>> show='sid' >>>>> parent=None >>>>> db.echo=True >>>>> tn = >>>>> >> session >> .query >> (TypeNode >> ).filter >> (TypeNode >> .Parent >> = >> =parent).filter(TypeNode.type==t).filter(TypeNode.project==show).all() >> 2008-11-10 12:30:50,452 INFO sqlalchemy.engine.base.Engine.0x...9a10 >> SELECT typehierarchy.project AS typehierarchy_project, >> typehierarchy.parent AS typehierarchy_parent, typehierarchy.id AS >> typehierarchy_id, typehierarchy.type AS typehierarchy_type, >> typehierarchy.static AS typehierarchy_static >> FROM typehierarchy >> WHERE NOT (EXISTS (SELECT 1 >> FROM typehierarchy >> WHERE typehierarchy.id = typehierarchy.parent)) AND >> typehierarchy.type = >> %(type_1)s AND typehierarchy.project = %(project_1)s >> 2008-11-10 12:30:50,452 INFO sqlalchemy.engine.base.Engine.0x...9a10 >> {'type_1': 'h2_prj', 'project_1': 'sid'} >> >>>>> tn >>>>> >> [<assetdb.TypeNode object at 0x201f3d0>] >> >> >> >> -- >> >> David Gardner >> Pipeline Tools Programmer, "Sid the Science Kid" >> Jim Henson Creature Shop >> [EMAIL PROTECTED] >> >> >> >> > > > > > >
-- David Gardner Pipeline Tools Programmer, "Sid the Science Kid" Jim Henson Creature Shop (323) 802-1717 [EMAIL PROTECTED] --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---