On Apr 15, 2010, at 2:16 PM, [email protected] wrote:
> Adding concrete=True got rid of the specific error listed. The problem I
> face now is the relation between connecttb and productionentities. How can I
> specify this relationship? I tried again and specified the relationships on
> the association object, Connection. This method throws the following error.
>
> connmapper = orm.mapper(Connection,connecttb,properties=dict(
> upstreamnodes=orm.relation(NetworkNode,primaryjoin=
> and_(connecttb.c.downstreamid==
> s.c.mobjectid,
> connecttb.c.downstreamtype==
> s.c.mobjecttype),
> foreign_keys=[
> s.c.mobjectid,
> s.c.mobjecttype]),
> downstreamnodes=orm.relation(NetworkNode,primaryjoin=
> and_(connecttb.c.upstreamid==
> s.c.mobjectid,
> connecttb.c.upstreamtype==
> s.c.mobjecttype)),
> foreign_keys=[
> s.c.mobjectid,
> s.c.mobjecttype]))
>
> ArgumentError: Column 'productionentities.merrickobjectid' is not represented
> in mapper's table. Use the `column_property()` function to force this column
> to be mapped as a read-only attribute.
hard to say since these are still only fragments, have you tried removing the
label()s below that are set on columns ? I'm assuming "mid" is
"merrickobjectid".
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')
>
> I played around with mobjectid = column_property(...) on the NetworkNode
> object, but I don't think that is the right direction.
>
> Is there a way to do this with polymorphic union? I don't see how to specify
> the relation on each type. The relation direction keeps tripping me up when
> the relation properties are not the association object, as the foreign key
> would be defined in connecttb, if that were possible.. By the way, this is
> all read-only.
>
> Wes Dyk
>
>
> Re: [sqlalchemy] Concrete table inheritance without a master table
>
> Michael Bayer to: sqlalchemy
> 04/14/2010 06:07 PM
>
> Sent by: [email protected]
>
> Please respond to sqlalchemy
>
>
>
>
>
>
>
>
> 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.
>
>
>
> --
> 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.