SQLAlchemy复合主键关联多外键报错AmbiguousForeignKeysError的解决
修复SQLAlchemy复合主键关联的AmbiguousForeignKeysError错误
你遇到的错误是因为SQLAlchemy无法自动推断复合主键与复合外键之间的完整连接逻辑,哪怕指定了foreign_keys,也需要明确每个外键列对应父表的哪个主键列。
下面是具体修复方案:
- 移除Parent类主键列的
unique=True:primary_key=True已经隐含了唯一约束和非空约束,重复设置完全多余。 - 在
relationship中通过primaryjoin参数明确复合主键的连接条件,让SQLAlchemy清晰知道两张表的关联规则。
修改后的完整代码:
from sqlalchemy import create_engine, Column, ForeignKey, Integer, and_ from sqlalchemy.orm import declarative_base, relationship Base = declarative_base() class Parent(Base): __tablename__ = "parent" id_1 = Column(Integer, primary_key=True) id_2 = Column(Integer, primary_key=True) children = relationship( "Child", back_populates="parent", primaryjoin=and_(id_1 == Child.f_id_1, id_2 == Child.f_id_2) ) class Child(Base): __tablename__ = "child" f_id_1 = Column(Integer, ForeignKey(Parent.id_1), primary_key=True) f_id_2 = Column(Integer, ForeignKey(Parent.id_2), primary_key=True) parent = relationship( Parent, back_populates="children", primaryjoin=and_(f_id_1 == Parent.id_1, f_id_2 == Parent.id_2) ) engine = create_engine("postgresql://user:pass@localhost:5432", future=True) Base.metadata.create_all(engine) from sqlalchemy.orm import Session with Session(engine) as session: # 注意:复合主键列必须赋值,不能留空 session.add(Parent(id_1=1, id_2=2)) session.commit()
额外提醒:你原来创建Parent实例时没有传入主键值,这会触发数据库报错,因为主键列不允许为空,所以必须给id_1和id_2赋值后再添加到会话。
内容的提问来源于stack exchange,提问作者nvhrw
相关产品推荐
相关产品推荐

