2017-12-17 72 views
0

2つのノードをリンクするエッジタイプクラスを作成しようとしています。各ノードはそれ自身のクラスであり、ノードとエッジの両方が同じグラフの一部でなければなりません。私は受け取りますsqlalchemyの複合外部キーの複数の関係

Could not determine join condition between parent/child tables on relationship TypeiNode.edges - there are no foreign keys linking these tables. 

外部キーが定義されていますが、私はノードテーブルedgesの関係で外部キーを定義しようとしましたが、同じ結果が得られました。誰かがこの例で間違っていることを教えてもらえますか?

class Edge(Base): 
    __tablename__ = 'edge' 

    id = Column(Integer, primary_key=True) 
    graph_id = Column(Integer, ForeignKey('graph.id')) 
    graph= relationship('Graph', back_populates='graph_edges') 
    type_1_node_id = Column(Integer, ForeignKey('type_1_node.id')) 
    type_1_node = relationship('Type1Node', 
           back_populates='edges', 
           foreign_keys=[type_1_node_id, graph_id]) 
    type_2_node_id = Column(Integer, ForeignKey('type_2_node.id')) 
    type_2_node = relationship('Type2Node', 
           back_populates='edges', 
           foreign_keys=[type_2_node_id, graph_id ]) 
    __table_args__ = (
     ForeignKeyConstraint(
      ['type_1_node_id', 'graph_id'], 
      ['type_1_node.id','type_1_node.graph_id']), 
     ForeignKeyConstraint(
      ['type_2_node_id', 'graph_id'], 
      ['type_2_node.id','type_2_node.graph_id']), 
    )  

class Type1Node(Base): 
    __tablename__ = 'type_1_node' 

    id = Column(Integer, primary_key=True) 
    graph_id = Column(Integer, ForeignKey('graph.id')) 
    graph = relationship('Graph', back_populates='graph_1_nodes') 
    edges = relationship('Edge', back_populates='type_1_node') 

class Type2Node(Base): 
    __tablename__ = 'type_2_node' 

    id = Column(Integer, primary_key=True) 
    graph_id = Column(Integer, ForeignKey('graph.id')) 
    graph = relationship('Graph', back_populates='graph_2_nodes') 
    edges = relationship('Edge', back_populates='type_2_node') 

答えて

0

あなたは慎重にエラーを読めば、あなたはそれはあなたがforeign_keys引数を追加しました関係文句ないです気づくでしょうが、あなたはしなかったもの:

Could not ... on relationship **TypeiNode.edges** ... 

は私が

を取ります

ノードテーブルのエッジの関係で外部キーを定義しようとしましたが、同じ結果が得られました。

これは、同時に両端を定義しようとしなかったことを意味します。だから解決策は、両端の外部キーを定義することです:

class Type1Node(Base): 
    __tablename__ = 'type_1_node' 

    id = Column(Integer, primary_key=True) 
    graph_id = Column(Integer, ForeignKey('graph.id')) 
    graph = relationship('Graph') 
    edges = relationship('Edge', back_populates='type_1_node', 
         foreign_keys=[Edge.type_1_node_id, Edge.graph_id]) 
+0

ありがとう@Iljaエベララ、それは働いた。しかし、私はSAWarningという形式の警告を受け取ります。関係 'Edge.type_1_node'はtype_1_node.graph_id列を列edge.graph_idにコピーします。これは関係と矛盾します: 'Edge.graph'(edge.graph.idをedgeにコピーします。 graph_id)。読取り専用の関係にviewonly = Trueを適用するか、書込み可能な列にforeign()アノテーションをマークするprimaryjoin条件を提供することを検討してください。このノード - エッジ - グラフ関係スキームを構築するより良い方法はありますか? – Dean