代码之家  ›  专栏  ›  技术社区  ›  carl

SQL炼金术:一对一的声明关系

  •  43
  • carl  · 技术社区  · 14 年前

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

    我有两张桌子, foo bar 我想要 foo.bar_id 链接到 酒吧 . 关键是这是一种单向的一对一的关系。 酒吧 一定不知道 . 对于每一个foo,将只有一个 酒吧 .

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

    myfoo.bar.whatever = 5 
    

    使用声明性实现这一点的最佳方法是什么?

    4 回复  |  直到 7 年前
        1
  •  35
  •   Brett Bim    14 年前

    如果你想要一对一的关系,你也必须在你的关系定义中使用“useList=false”。

    bar_id = Column(Integer, ForeignKey(Bar.id))
    bar = relationship(Bar, uselist=False)
    
        2
  •  98
  •   Jens Kirk Roybal    7 年前

    0.7的文档 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'))
    

    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)
    
        3
  •  4
  •   hamidfzm AlexLordThorsen    7 年前

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

    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)
    
        4
  •  2
  •   carl    14 年前

    事实证明这很容易。在您的foo模型中:

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