【发布时间】:2017-08-20 10:26:08
【问题描述】:
我正在尝试使用声明性 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'
我为关系和外键尝试了许多不同的配置,但都没有成功。根据我在文档和各种 Stackoverflow 示例中的理解,这是我对应该做什么的最佳猜测。显然我错过了一些东西。
感谢任何帮助/建议/cmets!
【问题讨论】:
-
我有一种感觉(这是一个遥远的记忆)“反向填充”用于在“远程”模型/表上自动创建“来自”关系。如果您在每个模型上显式创建“到”关系,则根本不需要在任何一个模型的关系上进行反向填充。
-
你试过像documentation那样使用
backref吗?这样,您在父表中声明子关系,因此您不应该收到该错误。缺点是您不会有foreign_keys参数,但由于这些列已经在ForeignKeyConstraint中,我认为这应该不是问题。 -
能否包含错误的完整堆栈跟踪。
标签: python sqlalchemy foreign-keys relationship foreign-key-relationship