SQLalchemy 中的 backref 和 back_populate 的概念?

Posted

技术标签:

【中文标题】SQLalchemy 中的 backref 和 back_populate 的概念?【英文标题】:Concepts of backref and back_populate in SQLalchemy? 【发布时间】:2018-12-22 10:27:08 【问题描述】:

谁能解释这两个想法的概念以及它们与表之间建立关系的关系?我似乎真的找不到任何可以清楚地解释它的东西,而且文档感觉在简单的概念中理解的行话太多了。例如,在此文档中的一对多关系示例中:

class Parent(Base):
    __tablename__ = 'parent'
    id = Column(Integer, primary_key=True)
    children = relationship("Child", back_populates="parent")

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

为什么relationship() 进入父类而ForeignKey 进入子类?拥有back_populates 到底对彼此有什么影响? relationship()函数存在于哪个类中?

【问题讨论】:

docs.sqlalchemy.org/en/latest/orm/backref.html When do I need to use sqlalchemy back_populates?的可能重复 “在简单的概念中有太多行话无法理解”,说得好 【参考方案1】:

backref 是一种快捷方式,用于仅在父类或子类(不是两者)上的一个位置同时配置 parent.childrenchild.parent relationships。也就是说,而不是拥有

children = relationship("Child", back_populates="parent")  # on the parent class

parent = relationship("Parent", back_populates="children")  # on the child class

你只需要一个:

children = relationship("Child", backref="parent")  # only on the parent class

parent = relationship("Parent", backref="children")  # only on the child class

children = relationship("Child", backref="parent") 将自动在子类上创建.parent 关系。另一方面,如果您使用back_populates,您必须在父类和子类中显式创建relationships。

为什么relation()在父类里面,而ForeignKey在子类里面?

正如我上面所说,如果你使用back_populates,它需要在父类和子类上都进行。如果你使用backref,它只需要继续其中之一。 ForeignKey需要放在子类上,不管relationship放在哪里,这是关系型数据库的一个基本概念。

拥有 back_populates 究竟对彼此有什么影响?

back_populates 通知每个关系关于另一个,以便它们保持同步。例如,如果你这样做

p1 = Parent()
c1 = Child()
p1.children.append(c1)
print(p1.children)  # will print a list of Child instances with one element: c1
print(c1.parent)  # will print Parent instance: p1

如您所见,p1 被设置为 c1 的父级,即使您没有明确设置它。

关系()函数存在于哪个类中?

这仅适用于backref,不,您可以将关系放在父类(children = relationship("Child", backref="parent"))或子类(parent = relationship("Parent", backref="children"))上,效果完全相同。

【讨论】:

放置 backref 决定了一对多关系的“一”端不是吗? 目前哪种做法更好?我有点喜欢 backref 只是因为它在某种程度上读起来更好...... 多么漂亮的答案

以上是关于SQLalchemy 中的 backref 和 back_populate 的概念?的主要内容,如果未能解决你的问题,请参考以下文章

彻底搞懂 SQLAlchemy中的 backref

SQLAlchemy学习-5.relationship之backref和back_populates参数

在 SQLAlchemy 中设计我的数据库模式时,我需要多久使用一次“backrefs”?

从 SQLAlchemy 查询中检索不同的 backref 实例

如何正确定义 SQLAlchemy backrefs 以便它们可以反映?

SQLAlchemy:为关系列赋值