使用foreign_keys选项进行多对多

时间:2019-04-04 13:27:27

标签: python sqlalchemy

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

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

当我在两个foreign_keys Feature`类上都删除了User and选项时,它可以工作,但是当我在这两个类之间添加具有映射关系的其他字段时,就会收到“多路径”异常。

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中的新Feature时,出现以下错误: 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.

1 个答案:

答案 0 :(得分:0)

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