sqlalchemy多个外键

时间:2012-09-01 15:46:31

标签: python sqlalchemy

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

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

能做到吗?

1 个答案:

答案 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集,请使用此模式。