12

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

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

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

4

1 回答 1

15

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

给定一个模型,如:

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.children,存在的列Parentlocal侧,存在的列是Child远程侧。

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

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

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

如果有 remote_side 那么为什么没有 local_side 呢?

有一个本地方面,如果你说 Parent.children.property.local_side 你会看到它。 remote_side并且local_side只是关系需要担心的事情,并且remote_side是公开的,您可以设置只是为了通过自我参照关系向关系提供提示;没有其他的。

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

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

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

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

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

于 2013-05-24T16:06:59.950 回答