0

我在同一个表之间有多对多的关系,并想在 Flask-AppBuilder 中定义它们。例如,人类之间的父子关系,其中两个实例属于同一个表“人类”。但是,当我这样做时,我得到了错误:

错误

sqlalchemy.exc.NoForeignKeysError:无法确定关系 Human.child 上的父/子表之间的连接条件 - 没有链接这些表的外键。确保引用列与 ForeignKey 或 ForeignKeyConstraint 相关联,或指定“primaryjoin”表达式。

示例模型.py

from flask_appbuilder import Model
from sqlalchemy import Column, String, ForeignKey
from sqlalchemy.orm import relationship

class HumanHasChild(Model):
    parent_id = Column(String(200), ForeignKey("Human.id"), primary_key=True)
    child_id = Column(String(200), ForeignKey("Human.id"), primary_key=True)

class Human(Model):
    id = Column(String(200), primary_key=True)
    child = relationship("HumanHasChild", foreign_keys="HumanHasChild.child_id")

与错误消息相反,我确实指定了外键三次。但是我也尝试添加显式连接条件:

class Human(Model):
    id = Column(String(200), primary_key=True)
    child = relationship("HumanHasChild", foreign_keys="HumanHasChild.child_id",primaryjoin="Human.id==HumanHasChild.parent_id")         

但是即使那样我也会收到一个错误:

sqlalchemy.exc.ArgumentError:在关系 Human.child 上找不到主连接条件“human.id = human_has_child.parent_id”的任何相关外键列。确保引用列与 ForeignKey 或 ForeignKeyConstraint 相关联,或者在连接条件中使用 foreign() 注释进行注释。

如何使同一张表中的多对多关系起作用?

4

1 回答 1

0

单个表上的 SQLAlchemy 多对多关系之后,答案是:

from flask_appbuilder import Model
from sqlalchemy import Column, String, ForeignKey, Table
from sqlalchemy.orm import relationship

HumanHasChild = Table("HumanHashChild",Model.metadata,
    Column("parent_id",String(200), ForeignKey("Human.id"), primary_key=True),
    Column("child_id",String(200), ForeignKey("Human.id"), primary_key=True)                                                                                                                                                                                                                                                  
    )

class Human(Model):
    id = Column(String(200), primary_key=True)
    child = relationship("Human",
    secondary=HumanHasChild,
    foreign_keys = [HumanHasChild.c.parent_id,HumanHasChild.c.child_id],
    primaryjoin=id==HumanHasChild.c.parent_id,
    secondaryjoin=id==HumanHasChild.c.child_id,
    backref="children")
于 2020-09-08T13:46:34.383 回答