0

在 SQLAlchemy 中,我想在表 A 中写一组记录。然后在表 BI 中写一个引用 A 中(先验)未知数量的记录的记录。

在 python 术语中,我将创建类 A 和 B,然后在 B 中有一个包含 A 类型对象的列表。

可以这样做吗?

4

1 回答 1

1

这不是一个真正的 SQLAlchemy 问题,而是一个基本的关系表问题。

您要么谈论一对多关系,要么谈论多对多关系,这两种关系 SQLAlchemy 都支持开箱即用。

一对多

一对多关系是一种基本的遏制关系;一个部门有很多员工,但每个员工只有一个部门。在这种情况下,只有一个传出关系的类获得外键,因此员工指的是部门,而不是相反。

SQLAlchemy 文档中的示例如下所示:

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

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

因此,如果您的A类只能是一B组的一部分,请使用此模式。

多对多

多对多关系是双方可以引用另一方的多个实例的关系。考虑员工和项目;一个员工可以是多个项目的一部分,一个项目可以涉及多个员工。

在 SQL 中,这种关系需要一个关联表,一个额外的数据库表,用于保存两个链接类型之间的映射。关于多对多关系的SQLAlchemy 文档清楚地记录了如何做到这一点;这是示例:

association_table = Table('association', Base.metadata,
    Column('left_id', Integer, ForeignKey('left.id')),
    Column('right_id', Integer, ForeignKey('right.id'))
)

class Parent(Base):
    __tablename__ = 'left'
    id = Column(Integer, primary_key=True)
    children = relationship("Child",
                    secondary=association_table)

class Child(Base):
    __tablename__ = 'right'
    id = Column(Integer, primary_key=True)

如果每个A对象可以是多个B集合的一部分,请使用此模式。

于 2012-09-01T16:04:58.003 回答