“加入”在同一个表中

时间:2013-02-04 21:53:16

标签: python sql sqlalchemy

我正在使用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和back-reference Person.persons都是   同一方向 。你的意思是设置remote_side   在多对一方面?

我怎么能在同一个表中加入,或者这是我正在使用的错误方法。如果我和B一起加入A人员,那么可以这样做吗,那么B人自动加入A(作为一个marriege工作 - 两种方式......)

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

3 个答案:

答案 0 :(得分:3)

您需要相邻列表关系。这是 documentation

  

这里的relationship()配置与“普通”一对多关系的工作方式相同,但“方向”除外,即关系是一对多还是多对多关系一,默认假设是一对多。要建立多对一关系,需要添加一个名为remote_side的额外指令,它是Column对象或Column对象的集合,表示应该被视为“远程

的那些对象”。

也许试试:

married_to = relationship("Person", remote_side=[id])

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

我会使用married_to列,以便彼此结婚的人的合作伙伴分别为id。然后您的查询将变得非常简化。