无法在GET接口传入两个sim_sttus_id进行仿真对比的问题
问题概述
需对比同一表中两个仿真(simulation_1、simulation_2)的组件,每个仿真对应唯一sim_sttus_id。当前接口硬编码了两个仿真ID,尝试修改路径或构造函数传递参数时,出现__init__()参数不匹配的错误,无法正常从Postman传入两个仿真ID。
解决方案
1. 用查询参数传递两个仿真ID
无需修改原有路径结构,保留/programs/<prog>/plans/<plan>/<versn>/sim_compare,通过URL查询参数(Query Params)传入sttus_id1和sttus_id2,避免路径参数重复导致的命名冲突。
2. 重构SimRes类的查询逻辑
调整get_select_comp方法
让方法接收sim_sttus_id参数,不再依赖实例的固定属性,支持查询任意仿真的组件列表:
def get_select_comp(self, sim_sttus_id): try: SSD = self.__sim_sttus_tbl CSCD = self.__comp_sim_conf_tbl ICD = self.__comp_tbl query = SnowflakeQuery.from_(CSCD) \ .join(SSD).on_field('PLAN_SIM_CONF_ID') \ .join(ICD).on_field('COMP_ID') \ .select(CSCD.COMP_SIM_CONF_ID, SSD.sim_sttus_id, CSCD.PLAN_SIM_CONF_ID, \ CSCD.COMP_ID, ICD.COMP_NAME) \ .where(Criterion.all([SSD.sim_sttus_id == sim_sttus_id])) \ .get_sql() comp_lst = self.execute_query(query) if isinstance(comp_lst['result'], str): raise QueryException(comp_lst) return comp_lst["result"] except Exception as e: raise
重构compare_sim_sttus方法
直接查询两个仿真的组件列表,通过集合快速匹配交集,同时移除原有逻辑错误的__check_comp_sttus方法:
def compare_sim_sttus(self, sttus_id1, sttus_id2): try: # 获取两个仿真的组件列表 comps_from_sim1 = self.get_select_comp(sttus_id1) comps_from_sim2 = self.get_select_comp(sttus_id2) # 提取第二个仿真的组件ID集合,用于快速查找 sim2_comp_ids = {comp['comp_id'] for comp in comps_from_sim2} # 筛选出在两个仿真中都存在的组件 matching_components = [ (comp['comp_id'], comp['comp_name']) for comp in comps_from_sim1 if comp['comp_id'] in sim2_comp_ids ] return matching_components except Exception as e: raise
可选:优化SimRes构造函数
如果构造函数中的sim_sttus参数已无实际作用,可将其设为可选参数:
def __init__(self, prog: str, plan: int, versn: float, sim_sttus: int = 0, tab_name: str = None, comp_id: int = None): super().__init__(prog) self.__prog = prog self.__plan = plan self.__versn = versn self.__sim_sttus = sim_sttus self.__tab_name = tab_name self.__comp_id = comp_id self.__sim_sttus_tbl = Table(f'{self.schema_name}.{self.__TABLE1}') self.__comp_sim_conf_tbl = Table(f'{self.schema_name}.{self.__TABLE2}') self.__comp_tbl = Table(f'{self.schema_name}.{self.__TABLE3}')
3. 更新Flask接口代码
修改接口方法,从查询参数中获取两个仿真ID,调整SimRes实例化逻辑:
import traceback from flasgger import swag_from from flask_restful import Resource, request from pathlib import Path from <path_to_module> import SimRes __all__ = ['SimResResource'] class SimResResource(Resource): @classmethod def get(cls, prog: str, plan: int, versn: float): try: # 从查询参数获取两个仿真ID并转为整数 sttus_id1 = int(request.args.get('sttus_id1')) sttus_id2 = int(request.args.get('sttus_id2')) # 初始化SimRes,无需传入固定sim_sttus_id components_compare = SimRes(prog=prog, plan=plan, versn=versn) response = components_compare.compare_sim_sttus(sttus_id1, sttus_id2) return success_response(response) except ValueError: return error_response("sttus_id1和sttus_id2必须为整数类型") except Exception as e: app.logger.error(f'{str(e)}: {traceback.format_exc()}') return error_response(e)
4. Postman调用方式
发起GET请求,URL格式为:/programs/<prog>/plans/<plan>/<versn>/sim_compare?sttus_id1=xxx&sttus_id2=xxx
将xxx替换为实际的两个仿真ID即可。
内容的提问来源于stack exchange,提问作者user3521180
相关产品推荐
相关产品推荐

