【问题标题】:SQLAlchemy, self-referential secondary table associationSQLAlchemy,自引用辅助表关联
【发布时间】:2010-08-13 20:55:45
【问题描述】:

我正在尝试在 SQLAlchemy 中创建一个“产品”对象,到目前为止,我已经让所有工作都接受了产品的“附件”。我拥有的是一个带有字段/值对列表(即容量: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 上的父/子表之间的连接条件”。我试过摆弄一堆,却无处可去。我不想失去对产品的独特引用,我觉得应该有一种更简单的方法来做到这一点,而不是将配件包装在另一个类中。

任何帮助将不胜感激!

【问题讨论】:

    标签: python sqlalchemy


    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-06
      • 2015-08-01
      • 1970-01-01
      • 2020-08-16
      • 2018-12-22
      • 1970-01-01
      相关资源
      最近更新 更多