【问题标题】:What is local and remote side?什么是本地端和远程端?
【发布时间】:2013-05-17 22:29:06
【问题描述】:

以下问题与数据库表关系和 SQLAlchemy 为其提供的抽象有关。

  1. 远程端和本地端有什么区别?
  2. 如果有remote_side,那为什么不是local_side
  3. here 给出的示例中,parent_id "local" 方面如何?
  4. remote_side 接受 list 那么它的元素是什么 list 应该是?如果它们是一个以上的元素,那么 这究竟意味着什么?

我已经阅读了好几遍docs,但无法理解其背后的基本概念以及如何正确使用它。 (几乎)我所知道的是,它应该将一对多关系转换为多对一。通常当我尝试使用它时,我感觉它的相关性,我最终引入了 SQLAlchemy 抱怨的歧义,在大多数情况下,通过一起删除 remote_side 参数来解决。

【问题讨论】:

    标签: sql sqlalchemy relationship


    【解决方案1】:

    远程端和本地端有什么区别?

    给定一个模型:

    class Parent(Base):
        # ...
        id = Column(Integer, primary_key=True)
        children = relationship("Child")
    
    class Child(Base):
        id = Column(Integer, primary_key=True)
        parent_id = Column(Integer, ForeignKey('parent.id'))
    

    关于关系Parent.childrenParent 上的列是local 端,Child 上的列是远程端。

    这似乎有点微不足道,只有当你有所谓的“自引用”关系时才会变得有趣,双方都引用同一张表:

    class Parent(Base):
        # ...
        id = Column(Integer, primary_key=True)
        parent_id = Column(Integer, ForeignKey('parent.id'))
        children = relationship("Parent")
    

    其中,Parent.idParent.children 的本地端,Parent.parent_id 是远程端,基于 Parent -> .children -> Parent 考虑左侧是“本地”,右侧是“远程”。

    如果有 remote_side 那为什么没有 local_side?​​p>

    有一个本地方面,如果你说 Parent.children.property.local_side 你会看到它。 remote_sidelocal_side 只是关系需要担心的事情,remote_side 是公共的,您可以设置它仅用于通过自引用关系为关系提供提示;没有别的。

    在此处给出的示例中,parent_id“本地”端如何?

    如果您有Node.parent,则看起来像Node --> .parent --> Node。 “本地”表示左侧,“远程”表示右侧。多对一自引用连接的方式类似于Node.parent_id = Node.id,因此 parent_id 是本地的。

    remote_side 接受一个列表,那么该列表的元素是什么 应该是?如果它们是一个以上的元素,那么什么 这究竟意味着什么?

    这是一个列表,因为在 SQLAlchemy 中,所有主键和外键都可能是复合的,也就是说,由多个列组成。在代理键的典型情况下,它是一个元素的列表。

    总体而言,您永远不需要使用remote_side,除非在非常特殊的多对一自引用关系的情况下。否则永远不需要它。

    【讨论】:

    • 在创建 children 属性时不会 Parent 抱怨,因为它不会 FK?
    • FK 与“remote”不同。 FK 指的是哪个数据库表在所有权意义上指的是另一个。 “本地”和“远程”是指您从哪个数据库表的角度来看(在自引用关系中,它的诡计,但也许假装真的有两个表 - 因为无论如何我们实际上是在谈论两个不同的行)。
    • @zzzeek API 有变化吗?我看不到,在children上找到property属性。
    • @zzzeek,很好的解释。谢谢迈克!我对property.remote_side也有同样的疑问,找不到。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-12
    • 2019-10-22
    • 1970-01-01
    • 2020-05-03
    • 2021-11-29
    • 1970-01-01
    相关资源
    最近更新 更多