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

car*_*arl 46 python sqlalchemy

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

我有两个表,foo而且bar,我想foo.bar_id链接到bar.问题在于这是一种单向一对一的关系.bar一定不能知道foo.对于每一个foo,都会有一个且只有一个bar.

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

myfoo.bar.whatever = 5 
Run Code Online (Sandbox Code Playgroud)

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

cha*_*lay 107

0.7的文档很好地解释了这一点:

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'))
Run Code Online (Sandbox Code Playgroud)

要么

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)
Run Code Online (Sandbox Code Playgroud)


Bre*_*Bim 35

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

bar_id = Column(Integer, ForeignKey(Bar.id))
bar = relationship(Bar, uselist=False)
Run Code Online (Sandbox Code Playgroud)

  • 这不完全正确,因为如果连接的FK与关系定义在同一个类中,则``uselist``关键字没有影响.有关正确的解决方案,请参阅[chadwick.boulay的答案](http://stackoverflow.com/a/9611874/851737). (8认同)

Ham*_*FzM 8

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

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)
Run Code Online (Sandbox Code Playgroud)