SQLAlchemy一对一,将外键存储在每个表中?

时间:2019-06-20 17:43:32

标签: python python-3.x sqlalchemy

我的笼子代码和dun数字之间是一对一的关系。

我已经建立了我的关系,在每个表中都存储了一个ForeignKey。

class Cage(Base):
    __tablename__ = 'DimCage'

    id = Column(Integer, primary_key=True)
    cage = Column(String(8), unique=True, nullable=False)
    duns_id = Column(Integer, ForeignKey('DimDuns.id'))

    duns = relationship('Duns', uselist=False, back_populates='cage')


class Duns(Base):
    __tablename__ = 'DimDuns'

    id = Column(Integer, primary_key=True)
    duns = Column(String(10), unique=True, nullable=False)
    dunsInt = Column(Integer, unique=True, nullable=False)
    cage_id = Column(Integer, ForeignKey('DimCage.id'))

    cage = relationship('Cage', uselist=False, back_populates='duns')

创建表时,出现以下错误,如何设置外键,以便在两个表上都保留引用?

  

sqlalchemy.exc.AmbiguousForeignKeysError:无法确定'DimCage'和'DimDuns'之间的联接;表之间有多个外键约束关系。请明确指定此连接的“ onclause”。

在处理上述异常期间,发生了另一个异常:

  

sqlalchemy.exc.AmbiguousForeignKeysError:无法确定关系Cage.duns的父/子表之间的联接条件-有多个链接表的外键路径。指定'foreign_keys'参数,并提供这些列的列表,这些列应被视为包含对父表的外键引用。

1 个答案:

答案 0 :(得分:1)

我相信对于一对一的关系,您只需要存储一个外键即可。
参见https://docs.sqlalchemy.org/en/13/orm/basic_relationships.html#one-to-one

您不应以这种方式丢失任何数据访问。如果您从duns_id中删除Cage列,则现在可以通过cage.duns.id而不是cage.duns_id访问ID。