【问题标题】:Create many to many on one table在一张桌子上创建多对多
【发布时间】:2013-06-19 14:56:09
【问题描述】:

Flask-SQLAlchemy 给出了一个example 如何创建多对多关系。它是在两个不同的表之间完成的。

是否可以在同一张表上创建多对多关系?例如,一个姐妹可以有很多姐妹,谁也会有很多姐妹。我试过了:

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:无法确定关系 Girl.sisters 上父/子表之间的连接条件 - 有多个外键路径通过辅助表“girl_sister_map”链接表。指定 'foreign_keys' 参数,提供这些列的列表,这些列应计为包含从辅助表到每个父表和子表的外键引用。

这可能吗?我该怎么做?

【问题讨论】:

    标签: python flask-sqlalchemy


    【解决方案1】:

    您正在尝试构建所谓的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"
        )
    

    【讨论】:

      猜你喜欢
      • 2012-05-23
      • 1970-01-01
      • 2018-03-19
      • 1970-01-01
      • 2017-02-07
      • 2011-11-17
      • 1970-01-01
      • 2018-06-06
      • 1970-01-01
      相关资源
      最近更新 更多