0

以下のようなSQLAlchemyモデルがありますが、最初は機能しませんでした(結合に問題があり、リストではなくスカラーが必要です)。付属のバージョンで「修正」しましたが、なぜそのように動作するのかよくわかりません。

最初は、これらForeignKeyのsではSizes.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

何が起こっているのかというと、2つの列に1つのFKではなく、2つの外部キーがあると思います。それができる場所では、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 に答える