sqlalchemy与一对多:为什么子项有parent_id属性?

0 投票
1 回答
1167 浏览
提问于 2025-04-18 16:21

我正在阅读sqlalchemy的关系配置文档。关于一对多双向关系的例子是这样的:

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

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

我的理解是,在Parent类中使用backref="parent",这会给Child类一个Child.parent属性,这个属性可以链接回原来的Parent对象。

但我不明白的是,为什么Child对象还需要明确的parent_id属性?这不是重复信息吗?这样做是为了让查询数据库更快,还是有其他好处?也许我对一对多双向关系的理解有误?

1 个回答

1

通过relationship创建的children(子项)和parent(父项)属性,只在你应用的“python世界”里有效。

而相对来说,两个id列和parent_id列则是真正存在于数据库中的列(在这个例子中就是这几个)。所以,当你访问一个父项,比如child.parent时,sqlalchemy会查找这个孩子的parent_id,然后从数据库中获取对应的Parent(父项)。反过来,对于parent.children,sqlalchemy会找到所有Children(子项)实例,它们的parent_id与父项匹配。

因此,这里没有信息重复的情况。你可以把childrenparent属性看作是方便的功能,它们为你处理数据库的逻辑。

撰写回答