使用声明式在SQLAlchemy中创建一对一关系的最佳方法是什么?
我有两个表,foo
和bar
,我希望foo.bar_id
链接到bar
。问题在于这是一种单向一对一的关系。 bar
必须对foo
一无所知。对于每个foo,将只有一个bar
。
理想情况下,选择foo之后,我可以这样做:
myfoo.bar.whatever = 5
使用声明式实现此目的的最佳方法是什么?
答案 0 :(得分:101)
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)