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

Python调用dishID函数报NameError,求修复实现菜品插入功能

解决NameError: name 'dishID' is not defined问题

问题根源

报错提示找不到dishID函数,核心原因是函数作用域不对——你大概率把dishID()定义在了某个内部函数(比如菜单选择逻辑的函数)里面,导致调用它的代码所在的作用域无法访问到这个函数。

修复步骤

  1. 调整函数作用域:把dishID()移到全局作用域,或者确保调用代码能访问到该函数的作用域。
  2. 修复SQL注入风险:原代码用format拼接SQL字符串,存在严重的SQL注入漏洞,改用参数化查询彻底解决这个问题。
  3. 处理字符串字段问题:插入dishname这类字符串类型字段时需要加引号,参数化查询会自动处理,不用手动拼接。

修正后的代码示例

全局作用域定义dishID函数

def dishID(cur):  # 把游标cur作为参数传入,避免依赖全局变量
    query = 'select count(*), max(DishID) from Dish'
    cur.execute(query)
    fetch = cur.fetchall()
    for i in fetch:
        if i[0] == 0:
            return 1
        else:
            return int(i[1]) + 1

修正后的插入逻辑

dishname = input('Enter Dish Name: ')
dishprice = input('Enter Dish Price: ')
# 确保调用时能访问到dishID函数,同时传入游标参数
dishid = str(dishID(cur))
# 使用参数化查询,安全且无需手动处理字符串引号
query = 'insert into Dish values(%s, %s, %s)'
cur.execute(query, (dishname, dishprice, dishid))
con.commit()
print("Dish has added successfully")

额外优化建议

可以给MySQL的DishID字段设置为自增主键(AUTO_INCREMENT),这样完全不需要手动生成ID,插入时直接省略该字段,数据库会自动分配唯一ID,既高效又能避免ID冲突问题。

内容的提问来源于stack exchange,提问作者oreoooohh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 03:45:37