sqlalchemy中的多对多自引用关系

Posted

技术标签:

【中文标题】sqlalchemy中的多对多自引用关系【英文标题】:Many-to-many self-referential relationship in sqlalchemy 【发布时间】:2011-05-09 19:11:46 【问题描述】:

我正在尝试在 sqlalchemy 中建立一个自我引用的多对多关系(这意味着 Line 可以有许多父行和许多子行),如下所示:

Base = declarative_base()

class Association(Base):
 __tablename__ = 'association'

 prev_id = Column(Integer, ForeignKey('line.id'), primary_key=True)                            
 next_id = Column(Integer, ForeignKey('line.id'), primary_key=True)


class Line(Base):
 __tablename__ = 'line'

 id = Column(Integer, primary_key = True)
 text = Column(Text)
 condition = Column(Text)
 action = Column(Text)

 next_lines = relationship(Association, backref="prev_lines")



class Root(Base):
 __tablename__ = 'root'

 name = Column(String, primary_key = True)
 start_line_id = Column(Integer, ForeignKey('line.id'))

 start_line = relationship('Line')

但我收到以下错误: sqlalchemy.exc.ArgumentError:无法确定父级/之间的连接条件 关系 Line.next_lines 上的子表。指定一个 'primaryjoin' 表达式 n.如果存在“secondary”,则还需要“secondaryjoin”。

你知道我该如何解决这个问题吗?

【问题讨论】:

我试过这个: next_lines = relationship(Association, backref="prev_lines", primaryjoin=id==Association.next_id) prev_lines = relationship(Association, backref="next_lines", primaryjoin=id== Association.prev_id) 现在它不会产生任何错误。这是一个正确的解决方案吗?还是会产生其他问题? 【参考方案1】:

你应该只需要:

prev_lines = relationship(
    Association,
    backref="next_lines",
    primaryjoin=id==Association.prev_id)

由于这指定了next_lines 反向引用,因此不需要next_lines 关系。

您也可以使用remote_side 参数对关系执行此操作:http://www.sqlalchemy.org/trac/browser/examples/adjacency_list/adjacency_list.py

【讨论】:

以上是关于sqlalchemy中的多对多自引用关系的主要内容,如果未能解决你的问题,请参考以下文章

从教义中的多对多自引用实体中获取孩子

多对多自引用表

通过联结表进行多对多自连接

如何使用 Doctrine 2 创建与额外字段的多对多自引用关联?

多对多自引用关系

Sequelize 多对多自引用