首页 > 解决方案 > 多对多使用 foreign_keys 选项

问题描述

我需要在两个表之间创建多对多关系。我需要指定该foreign_keys选项,因为我在两个表中都有其他相互引用。

直接使用关联表和对象Class的声明尝试了多种方法。Table

当我删除foreign_keys两个User andFeature` 类上的选项时,它可以工作,但是当我添加具有这两个类之间映射的其他字段时,我得到多路径异常。

feature_user = Table(
    'feature_user',
    Base.metadata,
    Column('feature_id', Integer, ForeignKey('features.id')),
    Column('user_id', Integer, ForeignKey('users.id')),
)

class Feature(Base):
    __tablename__ = 'features'

    id = getIdColumn()

    # other fields...

    cpm_engineers = relationship(
        'User',
        secondary=feature_user,
        foreign_keys=[feature_user.columns.user_id],
        back_populates='cpm_engineer_of',
    )

class User(Base):
    __tablename__ = 'users'

    id = getIdColumn()

    # other fields...

    cpm_engineer_of = relationship(
        'Feature',
        secondary=feature_user,
        foreign_keys=[feature_user.columns.feature_id],
        back_populates='cpm_engineers',
    )

创建新User的 aFeature时,出现以下错误: sqlalchemy.exc.NoForeignKeysError: Could not determine join condition between parent/child tables on relationship Feature.cpm_engineers - there are no foreign keys linking these tables via secondary table 'feature_user'. Ensure that referencing columns are associated with a ForeignKey or ForeignKeyConstraint, or specify 'primaryjoin' and 'secondaryjoin' expressions.

标签: pythonsqlalchemy

解决方案


我相信问题是我试图使用同一个表来存储多个绑定的多对多关联,例如特性测试用户、特性开发用户等。这当然是错误的。我需要使用第三列添加自定义 JOIN(例如添加新role列)或为每个关联创建单独的表(这是我最后所做的)。


推荐阅读