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

Reply via email to