【问题标题】:How to create one-to-one relationships with declarative如何使用声明式创建一对一关系
【发布时间】:2018-05-27 17:45:48
【问题描述】:

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

理想情况下,在选择 foo 后,我可以执行以下操作:

myfoo.bar.whatever = 5 

如何做到这一点?

【问题讨论】:

    标签: sqlalchemy


    【解决方案1】:

    文档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)
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 这并不完全正确,因为如果连接的 FK 与关系定义在同一类中,uselist 关键字没有影响。请参阅answer of chadwick.boulay 以获得正确的解决方案。
      【解决方案3】:

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

      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】:

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

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

        【讨论】:

          猜你喜欢
          • 2011-04-07
          • 2017-05-03
          • 1970-01-01
          • 2020-08-12
          • 2021-09-09
          • 2011-02-04
          • 2020-10-27
          • 1970-01-01
          相关资源
          最近更新 更多