You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 07:55:08