0

我有一个像下面这样的 SQLAlchemy 模型,起初它不起作用(连接问题,然后期待一个标量而不是列表)。我在包含的版本中“修复”了它,但我真的不明白为什么它会这样。

起初我预计那些ForeignKeysSizes.items relationship()不需要显式primaryjoin的,当我添加它时,SA 开始期待一个标量,我必须显式指定uselist=True.

为什么这种关系不能自动检测到这些事情中的一个或两个?

class Category(Base):
    __tablename__ = 'categories'
    pk   = Column(String(6), primary_key=True)

class Item(Base):
    __tablename__ = 'items'
    pk          = Column(String(6), primary_key=True)
    category_pk = Column(String(6), ForeignKey('categories.pk') )
    size        = Column(Integer(), nullable=False)
    category    = relationship('Category', backref=backref('items'))

class Sizes(Base):
    __tablename__ = 'sizes'
    category_pk = Column(String(6), ForeignKey('categories.pk'),
                    ForeignKey('items.category_pk'), primary_key=True )
    size        = Column(Integer(), ForeignKey('items.size'), primary_key=True )
    category    = relationship('Category', backref=backref('sizes'))
    items       = relationship('Item',
        uselist=True,
        primaryjoin="and_(Sizes.category_pk==Item.category_pk, Sizes.size==Item.size)" )
4

1 回答 1

1

我相信正在发生的事情是您有两个外键,而不是两列上的单个 FK。它的工作原理与 primary_key=True 有点不同,您可以在其中执行此操作。

尝试类似:

class Category(Base):
    __tablename__ = 'categories'
    pk   = Column(String(6), primary_key=True)

class Item(Base):
    __tablename__ = 'items'
    pk          = Column(String(6), primary_key=True)
    category_pk = Column(String(6), ForeignKey('categories.pk') )
    size        = Column(Integer(), nullable=False)
    category    = relationship('Category', backref=backref('items'))

class Sizes(Base):
    __tablename__ = 'sizes'
    category_pk = Column(String(6), primary_key=True )
    size        = Column(Integer(), primary_key=True )
    category    = relationship('Category', backref=backref('sizes'))
    items       = relationship('Item')

    __table_args__ = (
        ForeignKeyConstraint(
            ["category_pk", "size"],
            ["items.category_pk", "items.size"]
        ),
    )
于 2012-06-21T22:26:03.960 回答