SQLAlchemy,自引用辅助表关联

时间:2010-08-13 20:55:45

标签: python sqlalchemy

我正在尝试在SQLAlchemy中创建一个“Product”对象,到目前为止,我已经完成所有工作,接受产品的“附件”。我所拥有的是具有字段/值对列表的产品(即容量:12 L等),以及整数ID和目录号。我希望能够将某些“配件”与给定产品相关联,其中这些配件也是 产品。基本上我只想要一个具有product_id和accessory_id的关联表,它们都引用Products表中的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 个答案:

答案 0 :(得分: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)