On Apr 14, 2010, at 7:51 PM, [email protected] wrote:

> I've got a legacy database that I need to work through the following scenario 
> with. 
> There are four types of objects, completions, meters, tanks and equipment.  
> Each has its own table.  There is no "master" table representing all the 
> entities.  There is a connection table that describes the relationship 
> between the entities.  Each has a numeric identifier and the four types are 
> distinguished in the connection table by another numeric id, between 1 and 4. 
> In the implementation presented, I am trying to create a network node 
> abstract object with each of the four types inheriting from this class 
> (NetworkNode).  What I really want is to be able to query from an apex node 
> to its upstream objects and get a class of the specific type.  So if what I'm 
> doing is going about it in the wrong way, please set me straight!  The 
> problem I've run into is the following error.  Since there is no base table 
> to define foreign keys on, and I'm not sure if I should define properties of 
> each object as relations to the connection table, I'm not sure where to go 
> with this.  Any ideas? 
> 
> Can't find any foreign key relationships between 'productionentities' and 
> 'completiontb' 


would need to see the strucure of completiontb, connecttb, etc. to work out the 
above error as well as what triggers that error.  You do need to say 
"concrete=True" in an inheriting mapper which you'd like to be concrete versus 
its parent.





> 
> Here's the code (with some names changed and anything pertaining only to 
> tanks, meters or equipment left out).  I apologize for the lengthy message.  
> I'm not sure that I can condense this issue any further. 
> 
> from sqlalchemy import * 
> from sqlalchemy import sql 
> from sqlalchemy import orm 
> from pc.orm.tables import (tanktb, metertb, completiontb, equipmenttb, 
> connecttb) 
> from pc.orm.tables import metadata 
> 
> # add the object types to this selectable to define an abstract master table 
> # there's not much to know about the underlying tables except the columns 
> # listed here 
> cs = select([literal(1).label('mobjecttype'), 
>              completiontb.c.mid.label('mobjectid'), 
>              completiontb.c.wellpluscompletionname.label('objectname')]) 
> ms = select([literal(2),metertb.c.mid,metertb.c.metername]) 
> ts = select([literal(3),tanktb.c.mid,tanktb.c.tankname]) 
> es = select([literal(4),equipmenttb.c.mid,equipmenttb.c.equipmentname]) 
> 
> s = union_all(cs,ms,ts,es).alias('productionentities') 
> 
> # We'll call the abstract object a network node, since we are dealing with 
> # a network of objects 
> class NetworkNode(object): 
>     pass 
> 
> class Completion(NetworkNode): 
>     pass 
> 
> # Use an association object to represent the relationship between nodes 
> class Connection(object): 
>     pass 
> 
> connmapper = orm.mapper(Connection,connecttb) 
> 
> # Define the upstream and downstream relationships on the abstract node 
> nnmapper = orm.mapper(NetworkNode,s,primary_key=[s.c.mobjecttype, 
>                                                    s.c.mobjectid], 
>                       polymorphic_on=s.c.mobjecttype, 
>                       properties=dict( 
>                           
> upstreamobjects=orm.relation(Connection,primaryjoin= 
>                                and_(connecttb.c.downstreamid==s.c.mobjectid, 
>                                     
> connecttb.c.downstreamtype==s.c.mobjecttype)), 
>                           
> downstreamobjects=orm.relation(Connection,primaryjoin= 
>                                and_(connecttb.c.upstreamid==s.c.mobjectid, 
>                                     
> connecttb.c.upstreamtype==s.c.mobjecttype)))) 
> # the concrete types 
> cmapper = orm.mapper(Completion,completiontb,inherits=NetworkNode, 
>                  polymorphic_identity=1) 
> 
> Thank you for the help! 
> 
> Wes Dyk
> 
> -- 
> 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.

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

Reply via email to