sqlalchemy与一对多:为什么子项有parent_id属性?
我正在阅读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
与父项匹配。
因此,这里没有信息重复的情况。你可以把children
和parent
属性看作是方便的功能,它们为你处理数据库的逻辑。