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')
ありがとう@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