0

私はsqlalchemyを広範囲に使用するコードベースに取り組んでおり、それは初めてです。書きたいクエリのsqlalchemy式を作成するのに問題があります。

次の3つのテーブルがあります。

  1. 製品-(product_id、product_description、status、利用可能)
  2. カテゴリ-(category_id、category_description)
  3. ProductCategoryLink-(product_id、category_id)[多対多の関係の場合]

カテゴリごとの製品数を取得するクエリを実行しています。一部の商品はどのカテゴリにも割り当てられておらず、それらの商品も必要です(その場合、カテゴリはnullになります)。私は次のクエリを思いついた

select c.category_name, count(p.product_id)
from Product as p
left join ProductCategoryLink as pc
  on p.product_id = pc.product_id
left join Category as c      
  on c.category_id = pc.category_id
where p.store_id = 1111      
and p.status = 'ACTIVE'      
and p.available = 1
group by c.category_name; 

ormファイルに次のマッピングがあります

class Product(Base):
    __tablename__ = 'Product'

    product_id          = Column(Integer, primary_key=True, name='product_id')
    product_description = Column(UnicodeText, name='description')
    available           = Column(Boolean, name='available')
    status              = Column(Unicode(length=255), name='status')

metadata = Base.metadata
# association table between product and category
product_category_link = Table('ProductCategoryLink', metadata,
        Column('product_id', Integer, ForeignKey('Product.product_id')),
        Column('category_id', Integer, ForeignKey('Category.category_id'))
)

class Category(Base):
    __tablename__ = 'Category'

    category_id                 = Column(Integer, primary_key=True, name='category_id')
    category_name               = Column(Unicode(length=255), name='category_name')
    products                    = relation('Product', secondary=product_category_link, backref='categories')

次のORM式を思いついた

    query = session.query(Category.category_name, func.count(Product.product_id)).join(product_category_link).\
            join(Category).filter(
                and_(Product.store_id == self._store_id,
                    and_(Product.status == 'ACTIVE', Product.available == 1))).\
            group_by(Category.category_name).all()

上記の式が作成するSQLクエリは、私が望むものではありません。

sqlalchemy.exc.OperationalError: (OperationalError) (1066, "Not unique table/alias: 'Category'") 'SELECT `Category`.category_name AS `Category_category_name`, count(`Product`.product_id) AS count_1 \nFROM `Product`, `Category` INNER JOIN `ProductCategoryLink` ON `Category`.category_id = `ProductCategoryLink`.category_id INNER JOIN `Category` ON `Category`.category_id = `ProductCategoryLink`.category_id \nWHERE `Product`.store_id = %s AND `Product`.status = %s AND `Product`.available = %s GROUP BY `Category`.category_name' (1, 'ACTIVE', 1)

私はここで何が間違っているのですか?

4

2 に答える 2

1

Category on Category に参加する場合、エイリアスが必要です。

https://stackoverflow.com/a/1435186/708221を参照してください

于 2012-12-11T08:28:09.120 に答える
0

ドキュメントのエイリアスについて: http://docs.sqlalchemy.org/en/rel_0_9/orm/tutorial.html#using-aliases

于 2013-11-18T15:28:24.137 に答える