SQLAlchemy - 多对多传统和声明式映射

时间:2016-05-18 22:26:30

标签: sqlalchemy

根据SQLAlchemy的多对多关系文档,使用传统映射声明连接表。其他表使用Declarative mappings声明。

为什么不只是一种类型的映射,比如Declarative?在这种情况下,这可能吗?

    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)

1 个答案:

答案 0 :(得分:2)

这绝对是可能的,但人们通常不会这样做的原因仅仅是因为他们通常不想像对象那样使用关联表。

它看起来像:

class Left(Base):
    __tablename__ = 'left'
    id = Column(Integer, primary_key=True

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

class M2MRightLeft(Base):
    __tablename__ = 'm2m_right_left'
    left_id = Column(Integer, ForeignKey('left.id'), primary_key=True)
    right_id = Column(Integer, ForeignKey('right.id'), primary_key=True)

话虽如此,我通常会坚持传统的M2M关系映射。通常,如果我想要添加到M2M表中的其他列,我只使用声明式样式。