1

我正在创建一个使用 camelot(使用 sqlalchemy ORM)保存成员列表的程序。会有人相互结婚,这意味着同一张桌子内的一对一关系。这是 Person 类的简化版本:

class Person( Entity ):
    id = Column(Integer, primary_key=True)
    firstname = Column( Unicode(30), nullable = False )
    lastname = Column( Unicode(30), nullable = False )
    member_no = Column( Integer )
    marital_status = Column( Unicode(15) )
    marriage_date = Column( Date() )
    married_to = ... # Should be one to one with self

我试过这样做:

married_to = relationship("Person", uselist=False, backref="persons")
married_to_id = Column(Integer, ForeignKey('persons.id'))

但它失败了:

InvalidRequestError:一个或多个映射器无法初始化 - 无法继续初始化其他映射器。最初的例外是: Person.married_to 和反向引用 Person.persons 都是同一个方向。您的意思是在多对一上设置 remote_side 吗?

我怎么能加入同一张桌子,或者这是我使用的错误方法。如果我将人 A 与 B 结合,是否可以这样做,然后人 B 会自动与 A 结合(作为婚姻工作 - 双向......)

我希望我清楚自己。:-/

4

3 回答 3

3

你想要一个邻接列表关系。这是 文档

这里的 relationship() 配置与“正常”的一对多关系的工作方式相同,除了“方向”,即关系是一对多还是多对一,是默认情况下假定为一对多。为了建立多对一的关系,添加了一个称为 remote_side 的额外指令,它是一个 Column 或 Column 对象的集合,指示那些应该被视为“远程

也许尝试:

married_to = relationship("Person", remote_side=[id])
于 2013-02-04T21:57:52.597 回答
2

我不希望我回答你的问题,但想指出,由于两个人之间婚姻的双向性质,你可能需要考虑一个单独的表来保存婚姻,主键由两个组成person_id参考。您还可以考虑通过包含“开始”和“结束”日期来在此表中保留历史记录 =)

于 2013-02-04T22:00:14.003 回答
1

如果这都在同一个表中,则不能使用外键。根据定义,外键是来自其他表的键。

我会使用一个married_to专栏,让彼此结婚的人拥有各自的伴侣id。然后您的查询将变得非常简化。

于 2013-02-04T21:58:21.410 回答