如何修改Python查询函数以支持多列参数的关键词匹配?
多列关键词匹配的SQLAlchemy查询优化方案
现有模型类
class Companies(Base): __tablename__ = 'companies' ticker = Column(String, primary_key=True) name = Column(String) sector = Column(String) class Financial(Base): __tablename__ = 'financial' ticker = Column(String, primary_key=True) ebitda = Column(Float) sales = Column(Float) net_profit = Column(Float) market_price = Column(Float) net_debt = Column(Float) assets = Column(Float) equity = Column(Float) cash_equivalents = Column(Float) liabilities = Column(Float)
原函数局限
原search_data仅支持单列匹配,且在Python端做数据过滤,效率低下,仅能返回单个字段值:
def search_data(a, b): loaded = [ii for i in session.query(a) for ii in i if b in ii.lower()] print(loaded) if len(loaded) > 0: [print(*i) for i in enumerate(loaded)] return loaded else: print("Company not found!")
优化后的多列查询实现
from sqlalchemy import or_ def search_data(columns, keyword): # 构建多列模糊匹配条件:任意一列包含关键词(忽略大小写) match_conditions = or_(*[col.ilike(f"%{keyword.lower()}%") for col in columns]) # 查询匹配的完整Companies对象(需关联Financial可按需添加join逻辑) matched_companies = session.query(Companies).filter(match_conditions).all() if matched_companies: for idx, company in enumerate(matched_companies): print(f"{idx}: 股票代码={company.ticker}, 公司名称={company.name}, 所属行业={company.sector}") return matched_companies else: print("未找到匹配的公司!") return []
优化核心点
- 数据库端过滤:用
ilike和or_把匹配逻辑交给数据库处理,比Python端遍历全量数据效率提升明显,数据量越大优势越突出。 - 多列灵活匹配:参数
columns接受列对象列表(如[Companies.name, Companies.ticker]),可任意组合需要匹配的字段。 - 返回完整实例:不再返回单一字段值,而是返回完整的
Companies对象,方便后续获取关联属性或关联的Financial数据。 - 大小写不敏感:统一将关键词转小写后用
ilike匹配,避免大小写导致的漏匹配。 - 易读输出格式:打印结果时展示完整的公司信息,比原函数输出更直观。
使用示例
# 按公司名称和股票代码匹配关键词 search_data([Companies.name, Companies.ticker], "科技")
内容的提问来源于stack exchange,提问作者Breathe of fate
相关产品推荐
相关产品推荐

