Python 在同一个表中创建多对多关系
我在同一个表之间有多对多关系,希望在Flask AppBuilder中定义它们。例如,人与人之间的父子关系,其中两个实例都属于同一个表“Human”。但是,当我执行此操作时,会出现以下错误: 错误 sqlalchemy.exc.NoForeignKeyError:无法确定联接条件 关系Human.child上的父/子表之间-没有 链接这些表的外键。确保引用列 与ForeignKey或ForeignKeyConstraint关联,或指定 “primaryjoin”表达式 示例models.py 与错误消息相反,我确实指定了外键三次。但是,我也尝试添加显式连接条件:Python 在同一个表中创建多对多关系,python,sqlalchemy,flask-appbuilder,Python,Sqlalchemy,Flask Appbuilder,我在同一个表之间有多对多关系,希望在Flask AppBuilder中定义它们。例如,人与人之间的父子关系,其中两个实例都属于同一个表“Human”。但是,当我执行此操作时,会出现以下错误: 错误 sqlalchemy.exc.NoForeignKeyError:无法确定联接条件 关系Human.child上的父/子表之间-没有 链接这些表的外键。确保引用列 与ForeignKey或ForeignKeyConstraint关联,或指定 “primaryjoin”表达式 示例models.py 与
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.id”的键列=
human\u在关系human.child上有\u child.parent\u id'。确保
引用列与ForeignKey或
ForeignKeyConstraint,或在连接条件中使用
foreign()注释
如何使同一个表中的多对多关系发挥作用?下面,答案是:
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")
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")