首页 > 解决方案 > ArgumentError:无法在表上创建 ForeignKeyConstraint

问题描述

我对 SQLAlchemy 相当陌生,我想知道是否有人可以帮助我破译此错误消息:

错误::sqlalchemy.exc.ArgumentError:无法在表'attacker_battles'上创建ForeignKeyConstraint:不存在名为'battles.battle_id'的列。

它在Battles表中所做的。

我的代码:

class Battles(Base):
    __tablename__ = 'battles'
    battle_id = Column(Integer, primary_key=True)
    starttime = Column(DateTime)
    endtime = Column(DateTime)

class Attacker_Battles(Base):
    __tablename__ = 'attacker_battles'
    __table_args__ = (
        ForeignKeyConstraint(
            ['battle_id','battles.battle_id'],
            ['attacker_id','player.player_id']),
        UniqueConstraint('battle_id','attacker_id', 'player_id', name= 'attacking_player_unique_id')
        )
    attacker_id = Column(Integer, primary_key=True)
    battle_id = Column(Integer, primary_key=True)
    player_id = Column(Integer, primary_key=True)

标签: pythonsqlalchemy

解决方案


一个参数应该ForeignKeyConstaint是本地列的序列,第二个是引用的外部列的匹配序列。就像现在一样,您有 2 个本地、外国对的列表。

但是:您正在尝试创建一个引用 2 个或更多表的复合外键约束,这在 SQL中是不可能的。仔细想想,原因就很清楚了:什么会跨越多个表?

如果适合您的模型,您可以改为为battle_idand创建单独的外键约束:attacker_id

class Attacker_Battles(Base):
    __tablename__ = 'attacker_battles'
    attacker_id = Column(Integer, ForeignKey('player.player_id'), primary_key=True)
    battle_id = Column(Integer, ForeignKey('battles.battle_id'), primary_key=True)
    player_id = Column(Integer, primary_key=True)

此外,由于您已定义主键由 3 列组成,因此唯一约束是多余的。


推荐阅读