具有复合主键和外键的“InvalidRequestError:无属性”

问题描述 投票:0回答:2

我正在尝试使用声明性 SQLAlchemy (v1.1.5) 在两个表之间创建关系,其中表具有复合主键和外键。

这是两个表之间的一对多关系,其中Resource定义父级,每个资源有多个段,在Resourcesegment表中定义。我在两个表中都添加了 VersionID 列,因此我可以将数据库与多个版本的数据一起使用。

from sqlalchemy import Column, String, Integer, ForeignKeyConstraint
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship

Base = declarative_base()

class Resource(Base):
    __tablename__ = 'resource'
    VersionID = Column(String, primary_key=True)
    ResourceID = Column(String, primary_key=True)
    ResourceProperty = Column(String)
    segments = relationship("Resourcesegment", back_populates="resource")

class Resourcesegment(Base):
    __tablename__ = 'resourcesegment'
    VersionID = Column(String, primary_key=True)
    ResourceID = Column(String, primary_key=True)
    Segment_Type = Column(String, primary_key=True)
    Segment_Number = Column(Integer, primary_key=True)
    Segment_Property = Column(String)
    resource = relationship("Resource", foreign_keys=[VersionID, ResourceID], back_populates="segments")

    __table_args__ = (ForeignKeyConstraint([VersionID, ResourceID], [Resource.VersionID, Resource.ResourceID]),)

我收到的错误信息是:

InvalidRequestError: Mapper 'Mapper|Resourcesegment|resourcesegment' 没有属性 'resource'

python sqlalchemy foreign-keys relationship
2个回答
0
投票

假设您尝试使用段 PK 作为资源的 FK,请尝试在 PK 属性定义上定义 FK,例如沿着:

class Resourcesegment(Base):
    __tablename__ = 'resourcesegment'
    VersionID = Column(String, ForeignKey(Resource.VersionID), primary_key=True)
    ResourceID = Column(String, ForeignKey(Resource.ResourceID), primary_key=True)
    Segment_Type = Column(String, primary_key=True)
    Segment_Number = Column(Integer, primary_key=True)
    Segment_Property = Column(String)
    resource = relationship("Resource", back_populates="segments")

0
投票

上面贴出的代码是正确的。其他表中的一个有问题,抛出一个错误,看起来问题出在上面的表上。当我剥离所有东西时,我得到了我的简化模型,并且能够将问题隔离到更大模型的另一部分。

SQLAlchemy 的错误消息可能非常混乱,如果不进行额外的调试工作,不一定能够查明实际问题。

© www.soinside.com 2019 - 2024. All rights reserved.