SQLAlchemy, ассоциативная ссылка на вторичную таблицу - PullRequest
2 голосов
/ 14 августа 2010

Я пытаюсь создать объект «Продукт» в SQLAlchemy, и до сих пор я получил все, что работает, за исключением «аксессуаров» Продукта. То, что у меня есть, это продукт со списком пар поле / значение (т.е. вместимость: 12 л и т. Д.), А также целочисленный идентификатор и номер по каталогу. Я хотел бы иметь возможность ассоциировать определенные «аксессуары» с данным продуктом, где эти аксессуары являются и продуктами. По сути, я просто хочу таблицу сопоставлений, которая имеет product_id и accessory_id, которые оба ссылаются на идентификатор в таблице Products. Это то, что я до сих пор:

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 голос
/ 14 августа 2010
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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...