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

如何检查技能是否存在于skills_master表并将对应skill_id添加到emp_skills表

错误根因
  • 最直接的触发原因是查询方法调用错误:你执行skill_id查询时调用了execute_query而非execute_select_query,该方法执行select查询时不会返回结果集,默认返回None,后续代码直接用output3[0][0]下标访问None对象,直接触发报错。
  • 下标重复取值错误:你已经通过skill_id = output3[0][0]拿到了skill_id的具体值,后续更新表时又写了skill_id[0],如果skill_id是数字/普通字符串类型,该操作也会触发类型错误。
  • 业务逻辑缺失:else分支只完成了技能主数据的新增,没有获取新生成的skill_id写入emp_skills表,整个新增技能的业务逻辑不完整。
  • 隐含逻辑错误:给员工新增技能应该是向emp_skills表插入新记录,而非执行update操作,update会直接覆盖员工已有的技能关联数据,不符合多对多关联表的使用逻辑。
  • 存在SQL注入风险:所有SQL直接拼接用户输入参数,属于高危安全漏洞。
修复方案

统一查询方法调用,增加非空判断,修复取值错误,补全业务逻辑,推荐用参数化查询避免SQL注入,修复后代码如下:

skill_name = req_json.skill_name
emp_id = req_json.emp_id
# 复用工具类实例,避免重复创建连接
rdbms_util = RDBMSUtility()

# 参数化查询校验技能是否存在,避免注入,占位符可根据你的工具类要求调整为?/%s等
validation_query = "select skill_id from skills_master where skill_name = %s"
output = rdbms_util.execute_select_query(validation_query, params=(skill_name,))

skill_id = None
if output and len(output) > 0:
    # 技能已存在,直接取skill_id
    skill_id = output[0][0]
else:
    # 技能不存在,先新增主数据
    insert_skill_query = "insert into skills_master (skill_name) VALUES (%s)"
    rdbms_util.execute_query(insert_skill_query, False, params=(skill_name,))
    # 查询新生成的自增skill_id,MySQL用2320802,PostgreSQL可用RETURNING语法
    get_new_skill_id_query = "select 2320802"
    skill_id_res = rdbms_util.execute_select_query(get_new_skill_id_query)
    skill_id = skill_id_res[0][0]

# 给员工新增技能关联记录,使用insert而非update
insert_emp_skill_query = "insert into emp_skills (emp_id, skill_id) values (%s, %s)"
rdbms_util.execute_query(insert_emp_skill_query, False, params=(emp_id, skill_id))

内容的提问来源于stack exchange,提问作者n00b data engineer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 06:45:02