Ble*_*ers 9 sql sqlalchemy relationship
下面的问题与数据库表关系和SQLAlchemy为其提供的抽象有关.
remote_side话为什么不local_side呢?parent_id" 本地 "方面是怎样的?remote_side需要在list等什么是这些元素
list应该是什么?如果它们不仅仅是一个元素,那么它究竟意味着什么呢?我已经多次阅读过这些文档但却无法理解它背后的基本概念以及如何正确使用它.(几乎)所有我知道的是,它应该转换一个一个一对多的关系到多到一个.通常当我尝试使用它时,我感觉它的相关性,我最后引入了SQLAlchemy所抱怨的歧义,在大多数情况下,通过remote_side一起删除参数来解决这个问题.
zzz*_*eek 11
远程和本地端有什么区别?
给出一个如下模型:
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'))
Run Code Online (Sandbox Code Playgroud)
关于关系Parent.children,即存在于列Parent是local侧,即存在于列Child是远程侧.
这看起来有点微不足道,只有当你有一个所谓的"自我指涉"关系时才会变得有趣,在这种关系中,双方都会引用同一个表:
class Parent(Base):
# ...
id = Column(Integer, primary_key=True)
parent_id = Column(Integer, ForeignKey('parent.id'))
children = relationship("Parent")
Run Code Online (Sandbox Code Playgroud)
基于考虑左侧是"本地"而右侧是"远程" ,在上面,Parent.id是本地侧Parent.children并且Parent.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."local"表示左侧,"remote"表示右侧.多对一自引用连接的方式就像Node.parent_id = Node.id,所以parent_id是本地的.
remote_side接受一个列表,那么该列表的元素应该是什么?如果它们不仅仅是一个元素,那么它究竟意味着什么呢?
这是一个列表,因为在SQLAlchemy中,所有主键和外键都可能是复合的,这意味着包含多个列.在代理键的典型情况下,它是一个元素的列表.
总的来说,remote_side除了在多对一的自我指涉关系的特定情况下,你永远不需要使用.否则永远不需要它.