gpt4 book ai didi

python - SQLAlchemy 使用 Association 配置与自身的多对多关系

转载 作者:太空宇宙 更新时间:2023-11-03 14:33:03 32 4
gpt4 key购买 nike

我在配置与模型本身的多对多关系时遇到问题。当我使用 normal 时,我可以配置自多对多关系关系配置,即不使用关联对象的配置。

在这种情况下,我必须在多对多表本身中记录一些额外信息,因此我尝试使用关联对象 (PageLink) 实现关系。

这是模型。

class PageLink(Base):
'''
Association table.
'''
__tablename__ = 'page_links'

id = Column(Integer,primary_key=True)
page_from = Column(Integer,ForeignKey('page.id'),primary_key=True)
page_to = Column(Integer,ForeignKey('page.id'),primary_key=True)
extra_col1 = Column(String(256),nullable=False)

class Page(Base):
'''
main table
'''

__tablename__ = 'page'

id = Column(Integer,primary_key=True)
name = Column(String(56),nullable=False)

linked = relationship('PageLinks',backref='parent_page',
primaryjoin=id==PageLink.page_from,
secondaryjoin=id==PageLink.page_to)

这种方法行不通。我曾尝试删除“secondaryjoin”关键字,但它不起作用。

非常感谢有关此事的任何帮助或建议。

感谢阅读。

最佳答案

关联对象模式不是多对多关系的特殊化,而是一对多关系的特例,其中您有一个 left_table - 多对一- association_table - 一对多 - right_table 设置。简而言之,您需要两个 关系,它们都不应该有secondary/secondaryjoin

class PageLink(Base):
'''
Association table.
'''
__tablename__ = 'page_links'

id = Column(Integer,primary_key=True)
page_from = Column(Integer,ForeignKey('page.id'),primary_key=True)
page_to = Column(Integer,ForeignKey('page.id'),primary_key=True)
extra_col1 = Column(String(256),nullable=False)

class Page(Base):
'''
main table
'''

__tablename__ = 'page'

id = Column(Integer,primary_key=True)
name = Column(String(56),nullable=False)

linked_to = relationship('PageLinks',backref='parent_page',
primaryjoin=id==PageLink.page_from)
linked_from = relationship('PageLinks',backref='child_page',
primaryjoin=id==PageLink.page_to)

这意味着,要从某个页面 p 访问“to”链接的额外列,您必须执行以下操作:p.linked_to[0].extra_col1,或者获取实际的链接页面,p.linked_to[0].page_to


顺便说一句,使用自动增量主键或(左/右)外键对作为关联中的主键通常是个好主意,但在主键中同时使用这两者几乎没有用。结合这两种想法的替代方法是使用自动增量整数作为主键中的唯一列,并对左/右外键列有一个额外的唯一约束。

关于python - SQLAlchemy 使用 Association 配置与自身的多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7261383/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com