2010-08-13 3 views
2

SQLAlchemy에서 "Product"개체를 만들려고하는데 지금까지 제품의 "액세서리"를 사용하는 모든 작업을 수행했습니다. 내가 가진 것은 필드/값 쌍 목록 (용량 : 12 L 등)과 정수 ID 및 카탈로그 번호가있는 제품입니다. 나는이 부속품이 인 제품과 특정 "부속품"을 연관시킬 수 있기를 바라고 있습니다. 기본적으로 Products 테이블의 ID를 참조하는 product_id 및 accessory_id가있는 연결 테이블 만 필요합니다.SQLAlchemy, 자체 참조 보조 테이블 연결

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
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)