Python sqlalchemy架构:没有唯一的约束匹配引用表的给定键

Python sqlalchemy架构:没有唯一的约束匹配引用表的给定键,python,sql,sqlalchemy,database-schema,alembic,Python,Sql,Sqlalchemy,Database Schema,Alembic,我正在尝试使用SQLAlchemy模型创建两个表,它们的结构相同,但用途不同,白名单和黑名单也引用了未显示的杂志。它们都是fkey到一个竞选的实例,比如说一个政治竞选,而这个政治竞选又有一个fkey到一个政治家的模型,但也没有显示出来 我将白名单/黑名单想象为多个:1到活动,因为可能有多个白名单/黑名单,但在运行迁移时,我得到sqlalchemy.exc.ProgrammingError:ProgrammingError没有唯一的约束匹配引用表活动的给定键。从竞选活动到政治家,还需要有一个M:1

我正在尝试使用SQLAlchemy模型创建两个表,它们的结构相同,但用途不同,白名单和黑名单也引用了未显示的杂志。它们都是fkey到一个竞选的实例,比如说一个政治竞选,而这个政治竞选又有一个fkey到一个政治家的模型,但也没有显示出来

我将白名单/黑名单想象为多个:1到活动,因为可能有多个白名单/黑名单,但在运行迁移时,我得到sqlalchemy.exc.ProgrammingError:ProgrammingError没有唯一的约束匹配引用表活动的给定键。从竞选活动到政治家,还需要有一个M:1

有人能解释一下为什么这会导致一个唯一的约束错误,因为白名单和黑名单在不同的表上?另外,我怎样才能使这个关系模式工作呢

class Campaign(Base):
    __tablename__ = "campaigns"
    id = Column(Integer, primary_key=True, nullable=False)
    politician_id = Column(Integer, ForeignKey('politician.id'), nullable=False)
    description = Column(Text, nullable=True)


class Whitelist(Base):
    __tablename__ = "whitelist"
    id = Column(Integer, primary_key=True, nullable=False)
    campaign_id = Column(Integer, ForeignKey('campaign.id'), nullable=False)
    magazine_id = Column(Integer, ForeignKey('magazine.id'), nullable=False)


class Blacklist(Base):
    __tablename__ = "blacklist"
    id = Column(Integer, primary_key=True, nullable=False)
    campaign_id = Column(Integer, ForeignKey('campaign.id'), nullable=False)
    magazine_id = Column(Integer, ForeignKey('magazine.id'), nullable=False)

这种关系似乎确实是非法的,因为从白名单/黑名单到竞选活动的比例是M:1,而竞选活动本身就是一个M:1到政客的比例。相反,我放弃了这种方法,现在的模型如下:

class Campaign(Base):
    __tablename__ = "campaigns"
    id = Column(Integer, primary_key=True, nullable=False)
    politician_id = Column(Integer, ForeignKey('politician.id'), nullable=False)
    description = Column(Text, nullable=True)


class Listing(Base):
    __tablename__ = "listings"
    id = Column(Integer, primary_key=True, nullable=False)
    campaign_id = Column(Integer, ForeignKey('campaign.id'), nullable=False)
    magazine_id = Column(Integer, ForeignKey('magazine.id'), nullable=False)
    listing_type = Column(String, nullable=False)

最初的方法是为了更好地适应Flask Admin,但这种方法性能更高,因为它将减少前一个版本中所需的额外查询和连接。对于那些可能考虑将这种方法用于Flask Admin的人,可以使用内联_模型使UI更干净、更易于管理。

我不明白为什么表a->表B M:1、表B->表C M:1是非法的。