SQLAlchemy

时间:2016-04-15 13:53:36

标签: sqlalchemy

假设我正在模拟邮政地址更改。我希望每个AddressChangebefore建立Address关系,并与另一个after建立Address关系。我希望从Address返回与AddressChange关联的参考。

class AddressChange(Base):
  __tablename__ = 'AddressChanges'

  id = Column(Integer, primary_key=True)

  before_id = Column(Integer, ForeignKey('Addresses.id'))
  before = relationship('Address', foreign_keys=before_id, uselist=False,
    back_populates='change')

  after_id = Column(Integer, ForeignKey('Addresses.id'))
  after = relationship('Address', foreign_keys=after_id, uselist=False,
    back_populates='change')


class Address(Base):
  __tablename__ = 'Addresses'

  id = Column(Integer, primary_key=True)
  street, city, etc = Column(String), Column(String), Column(String)

  change = relationship('AddressChange')

然而,SQLAlchemy抱怨道:

  

无法确定关系Address.change上的父/子表之间的连接条件 - 有多个链接表的外键路径。指定'foreign_keys'参数,提供应列为包含父表的外键引用的列的列表。

我的Address没有拥有对父表的外键引用,而且我不清楚为什么它需要一个。如果我加一个,我得

  

Address.change和back-reference AddressChange.before都是相同的方向符号('MANYTOONE')。你的意思是在多对一方设置remote_side吗?

这开始变得令人困惑,因为remote_side的文档是针对“自引用关系的。”

1 个答案:

答案 0 :(得分:1)

感谢@ alex-grönholm帮助#sqlalchemy。

这可以通过在primaryjoin的关系中添加Address参数来解决,以教会它​​如何映射回父AddressChange

change = relationship('AddressChange', uselist=False,
  viewonly=True,
  primaryjoin=or_(
    AddressChange.before_id == id,
    AddressChange.after_id == id
  ))