在SQLAlchemy中,我想在表A中写一组记录。然后在表B中,我想写一条记录,该记录引用A中的(先验的)未知数量的记录。
在python术语中,我将创建类A和B,然后在B中包含一个包含A类对象的列表。
能做到吗?
答案 0 :(得分:1)
这不是一个SQLAlchemy问题,而是一个基本的关系表问题。
你要么谈论的是一对多的关系,要么是多对多的关系,这两种关系都是SQLAlchemy支持开箱即用的。
一对多的关系是基本的遏制之一;一个部门有很多员工,但每个员工只有一个部门。在这种情况下,只有一个外向关系的类会获得外键,因此员工会引用部门,而不是相反。
example from the SQLAlchemy documentation为:
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 documentation on many-to-many relationships文件清楚地说明了如何做到这一点;这是一个例子:
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
集,请使用此模式。