SQLAlchemy 自引用的二级表关联

3 投票
1 回答
563 浏览
提问于 2025-04-16 02:46

我正在尝试在SQLAlchemy中创建一个“产品”对象,到目前为止,除了产品的“配件”之外,其他都已经正常工作了。我现在有一个产品,它有一系列的字段/值对(比如容量:12升等),还有一个整数ID和一个目录编号。我希望能够将某些“配件”与特定的产品关联起来,而这些配件也是产品。简单来说,我只想要一个关联表,这个表有产品ID和配件ID,这两个ID都指向产品表中的ID。这是我目前的代码:

product_accessories=Table('product_accesssories',Base.metadata,\
                   Column('product_id',Integer,ForeignKey('product.product_id')),\
                   Column('accessory_id',Integer,ForeignKey('product.product_id')))

class Product(Base):
    __tablename__='product'
    id=Column('product_id',Integer,primary_key=True)
    catNo=Column('catalog_number',String(20))
    fields=relationship('ProductField')
    accessories=relationship('Product',secondary=product_accessories)

但是我遇到了一个错误:“无法确定父子表之间的连接条件,关系为Product.accessories”。我尝试了很多方法,但都没有成功。我不想失去对产品的唯一引用,而且我觉得应该有更简单的方法来处理这个问题,而不是把配件放在另一个类里。

任何帮助都将非常感谢!

1 个回答

1
import sqlalchemy as sa
from sqlalchemy import orm

products_table = sa.Table('products', metadata,
    sa.Column('id', sa.Integer(), primary_key=True),
    sa.Column('catalog_number', sa.String(20)),
)

accessories_table = sa.Table('product_accessories', metadata,
    sa.Column('product_id', sa.ForeignKey(products_table.c.id), primary_key=True),
    sa.Column('accessory_id', sa.ForeignKey(products_table.c.id), primary_key=True),
)

class Product(object):
    pass

class Accessory(object):
    pass

orm.mapper(Product, products_table, properties=dict(
    accessories=orm.relation(Accessory,
        primaryjoin=(products_table.c.id == accessories_table.c.product_id),
        secondaryjoin=(products_table.c.id == accessories_table.c.accessory_id),
    ),
))
orm.mapper(Accessory, accessories_table)

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

撰写回答