2012-12-11 25 views
0

我正在研究一個廣泛使用sqlalchemy的代碼庫,我對它很陌生。我無法爲我想寫的查詢編寫sqlalchemy表達式。sqlalchemy sql組合

我們有以下3個表:

  1. 產品 - (產品,PRODUCT_DESCRIPTION,狀態,可用)
  2. 分類 - (CATEGORY_ID,category_description)
  3. ProductCategoryLink - (產品,CATEGORY_ID)對於多對多關係]

我正在運行一個查詢,該查詢給出了每個類別的產品數量。有些產品沒有分配到任何類別,我也希望這些產品(在這種情況下類別將爲空)。我想出了以下查詢

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) 

我在這裏做錯了什麼?

回答