【问题标题】:sqlalchemy and one to many: why does the child have a parent_id attribute?sqlalchemy 和一对多:为什么孩子有 parent_id 属性?
【发布时间】:2014-09-30 10:55:03
【问题描述】:

我正在浏览 sqlalchemy Relationship Configuration 文档。一对多双向关系的示例如下所示:

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 类提供了一个链接回原始Parent 对象的Child.parent 属性。

然后我不明白为什么Child 对象仍然明确需要parent_id 属性?这不是加倍信息吗?它是否可以更快地查询数据库,还是有其他一些好处?也许我误解了双向一对多关系是如何开始的?

【问题讨论】:

    标签: python database database-design sqlalchemy


    【解决方案1】:

    relationship 创建的childrenparent 属性仅在应用程序的“python 世界”中可用。

    相比之下,两个id 列和parent_id 列是数据库中的实际列(本示例中的唯一列)。 因此,当您访问像 child.parent 这样的父级时,sqlalchemy 会查找子级的 parent_id 并从数据库中检索具有此 ID 的 Parent。 反过来,对于parent.children,sqlalchemy 会找到所有具有匹配parent_idChildren 实例。

    因此没有重复信息。 您可以将childrenparent 属性视为便捷函数,为您完成数据库逻辑。

    【讨论】:

    • 谢谢@sebastian。所以如果没有parent_id,这种关系就行不通,是吗? child.parent 如何查找parent_id?它是否正在查看以parent 作为外键的列?还是我错过了一个命名约定?
    • 是的,parent_id 列是使孩子成为某个父母的孩子的关键信息。 SQLAlchemy 使用parent_id,因为它被声明为ForeignKey('parent.id') - 声明parent_id 匹配parent.idid 表中的id 列。
    • 干杯!现在我认为这是有道理的
    猜你喜欢
    • 2010-10-20
    • 1970-01-01
    • 2014-09-17
    • 2012-02-08
    • 2014-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-16
    相关资源
    最近更新 更多