【问题标题】:SQLAlchemy one-to-one, store foreign key in each table?SQLAlchemy一对一,在每个表中存储外键?
【发布时间】:2019-11-03 14:10:47
【问题描述】:

我在笼子代码和邓恩编号之间存在一对一的关系。

我已经建立了看起来像这样的关系,我在每个表上存储了一个 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' 参数,提供应计为包含对父表的外键引用的列的列表。

【问题讨论】:

    标签: python python-3.x sqlalchemy


    【解决方案1】:

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

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

    【讨论】:

    • 我通常会这样做,我不知道人们是否将 fk 放在两个表中。这些示例确实显示了父 子,这更像是兄弟 兄弟关系。
    • 这不是问题的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-03
    • 2020-12-30
    • 1970-01-01
    • 2021-07-02
    • 2016-10-10
    • 2014-08-19
    • 2023-03-03
    相关资源
    最近更新 更多