AttributeError:Query对象无is_clause_element属性,表关联查询报错求助
问题场景
我编写了一条SQLAlchemy查询语句,用于统计各公司的关键词数量,并按关键词数量降序排序取前20条:
query_company_ids = Session.query(enjordplatformCompanyToKeywords.company_id.label("company_id"),func.count(enjordplatformCompanyToKeywords.keyword_id)).group_by(enjordplatformCompanyToKeywords.company_id).order_by(desc(func.count(enjordplatformCompanyToKeywords.keyword_id))).limit(20)
需要获取这些公司的详情(如图片、名称、介绍等)返回给前端,但在将query_company_ids与enjordplatformCompanies表关联时遇到问题。尝试了两种关联方式:
1.
companies_query = Session.query(enjordplatformCompanies, query_company_ids).filter(enjordplatformCompanies.id == query_company_ids.company_id).all()
companies_query = Session.query(enjordplatformCompanies, query_company_ids).join( query_company_ids, query_company_ids.c.company_id == enjordplatformCompanies.id).all()
两种方式均触发错误:AttributeError: 'Query' object has no attribute 'is_clause_element'
表定义如下:
class enjordplatformCompanies(Base): __tablename__ = "enjordplatform_companies" id = Column(Integer, primary_key=True, unique=True) name = Column(String) about = Column(String) image = Column(String) website = Column(String) week_added = Column(Integer) year_added = Column(Integer) datetime_added = Column(DateTime) created_by_userid = Column(Integer) company_type = Column(String) contact_email=Column(String) adress=Column(String) city_code=Column(String) city=Column(String) class enjordplatformCompanyToKeywords(Base): __tablename__ = "enjordplatform_company_to_keywords" id = Column(Integer, primary_key=True, unique=True) company_id = Column(Integer,ForeignKey("enjordplatform_companies.id")) keyword_id = Column(Integer,ForeignKey("enjordplatform_keywords.id"))
解决方案
方法1:将统计查询转为子查询后关联
不能直接把Query对象当作表关联,需要先将原统计查询转为子查询(subquery),再通过子查询的字段关联主表:
# 将统计查询转为子查询 company_keyword_count_subq = Session.query( enjordplatformCompanyToKeywords.company_id.label("company_id"), func.count(enjordplatformCompanyToKeywords.keyword_id).label("keyword_count") ).group_by(enjordplatformCompanyToKeywords.company_id).order_by(desc(func.count(enjordplatformCompanyToKeywords.keyword_id))).limit(20).subquery() # 关联子查询与公司表,获取详情+关键词数量 companies_query = Session.query( enjordplatformCompanies, company_keyword_count_subq.c.keyword_count ).join( company_keyword_count_subq, enjordplatformCompanies.id == company_keyword_count_subq.c.company_id ).all()
- 调用
.subquery()后,可通过.c.字段名访问子查询中的字段 - 用子查询对象和对应字段完成关联,即可避免原错误
方法2:一步完成统计+关联查询
无需拆分两次查询,直接在一次查询中完成关联、统计、排序和限制,效率更高:
companies_query = Session.query( enjordplatformCompanies, func.count(enjordplatformCompanyToKeywords.keyword_id).label("keyword_count") ).join( enjordplatformCompanyToKeywords, enjordplatformCompanies.id == enjordplatformCompanyToKeywords.company_id ).group_by(enjordplatformCompanies.id).order_by(desc(func.count(enjordplatformCompanyToKeywords.keyword_id))).limit(20).all()
- 直接关联公司表与关键词关联表,按公司ID分组统计关键词数量
- 一次查询即可拿到所有公司详情及对应关键词数量
内容的提问来源于stack exchange,提问作者user12288003
相关产品推荐
相关产品推荐

