2013-06-22 17 views
5

Flask-SQLAlchemyは、多対多リレーションシップを作成する方法のexampleを提供します。これは2つの異なるテーブルの間で行われます。複数テーブルを1つのテーブルに作成する

同じテーブルに多対多リレーションシップを作成することはできますか?たとえば、姉妹には多くの姉妹がいて、姉妹には多くの姉妹がいます。私が試してみました:

girl_sister_map = db.Table('girl_sister_map', 
         db.Column('girl_id', 
           db.Integer, 
           db.ForeignKey('girl.id')), 
         db.Column('sister_id', 
           db.Integer, 
           db.ForeignKey('girl.id'))) 

class Girl(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String) 
    sisters = db.relationship('Girl', 
           secondary=girl_sister_map, 
           backref=db.backref('othersisters', lazy='dynamic')) 

しかし、私は私が手少女に妹を追加しようとすると:

sqlalchemy.exc.AmbiguousForeignKeysError: Could not determine join condition between parent/child tables on relationship Girl.sisters - there are multiple foreign key paths linking the tables via secondary table 'girl_sister_map'. Specify the 'foreign_keys' argument, providing a list of those columns which should be counted as containing a foreign key reference from the secondary table to each of the parent and child tables.

これは可能ですか?私はどのようにそれをやっていますか?

答えて

9

adjacency listと呼ばれるものを構築しようとしています。つまり、自分自身には外部キーを持つテーブルがあります。

具体的にはself referencial many to many relationshipです。

これは、SQLAlchemyでサポートされています。これは、前のリンクをたどって見つけます。ドキュメントにはいくつかの例があります。

基本的には、テーブルへの参加方法を設定するには、primaryjoinsecondaryjoin引数が必要です。ドクターから直接:

Base = declarative_base() 

node_to_node = Table("node_to_node", Base.metadata, 
    Column("left_node_id", Integer, ForeignKey("node.id"), primary_key=True), 
    Column("right_node_id", Integer, ForeignKey("node.id"), primary_key=True) 
) 

class Node(Base): 
    __tablename__ = 'node' 
    id = Column(Integer, primary_key=True) 
    label = Column(String) 
    right_nodes = relationship("Node", 
         secondary=node_to_node, 
         primaryjoin=id==node_to_node.c.left_node_id, 
         secondaryjoin=id==node_to_node.c.right_node_id, 
         backref="left_nodes" 
    ) 
関連する問題