gpt4 book ai didi

python - 在一张 table 上创建多对多

转载 作者:太空狗 更新时间:2023-10-30 00:45:33 26 4
gpt4 key购买 nike

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: 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.

这可能吗?我应该怎么做?

最佳答案

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

关于python - 在一张 table 上创建多对多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17252816/

26 4 0