sqlalchemy:与声明性的一对一关系

时间:2010-08-12 02:59:02

标签: python sqlalchemy

使用声明式在SQLAlchemy中创建一对一关系的最佳方法是什么?

我有两个表,foobar,我希望foo.bar_id链接到bar。问题在于这是一种单向一对一的关系。 bar必须对foo一无所知。对于每个foo,将只有一个bar

理想情况下,选择foo之后,我可以这样做:

myfoo.bar.whatever = 5 

使用声明式实现此目的的最佳方法是什么?

4 个答案:

答案 0 :(得分:101)

文档explains this nicely

class Parent(Base):
    __tablename__ = 'parent'
    id = Column(Integer, primary_key=True)
    child = relationship("Child", uselist=False, backref="parent")

class Child(Base):
    __tablename__ = 'child'
    id = Column(Integer, primary_key=True)
    parent_id = Column(Integer, ForeignKey('parent.id'))

OR

class Parent(Base):
    __tablename__ = 'parent'
    id = Column(Integer, primary_key=True)
    child_id = Column(Integer, ForeignKey('child.id'))
    child = relationship("Child", backref=backref("parent", uselist=False))

class Child(Base):
    __tablename__ = 'child'
    id = Column(Integer, primary_key=True)

答案 1 :(得分:35)

如果您想要真正的一对一关系,您还必须在关系定义中使用“uselist = False”。

bar_id = Column(Integer, ForeignKey(Bar.id))
bar = relationship(Bar, uselist=False)

答案 2 :(得分:4)

我认为如果它是真正的一对一关系,我们应该为外键添加唯一性约束,以便另一个父母不能拥有其他父子!!像这样:

class Parent(Base):
    __tablename__ = 'parent'
    id = Column(Integer, primary_key=True)
    child_id = Column(Integer, ForeignKey('child.id'), unique=True)
    child = relationship("Child", backref=backref("parent", uselist=False))

class Child(Base):
    __tablename__ = 'child'
    id = Column(Integer, primary_key=True)

答案 3 :(得分:2)

事实证明这实际上很容易。在你的Foo模型中:

bar_id = Column(Integer, ForeignKey(Bar.id))
bar = relationship(Bar)