Python调用dishID函数报NameError,求修复实现菜品插入功能
解决NameError: name 'dishID' is not defined问题
问题根源
报错提示找不到dishID函数,核心原因是函数作用域不对——你大概率把dishID()定义在了某个内部函数(比如菜单选择逻辑的函数)里面,导致调用它的代码所在的作用域无法访问到这个函数。
修复步骤
- 调整函数作用域:把
dishID()移到全局作用域,或者确保调用代码能访问到该函数的作用域。 - 修复SQL注入风险:原代码用
format拼接SQL字符串,存在严重的SQL注入漏洞,改用参数化查询彻底解决这个问题。 - 处理字符串字段问题:插入
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
相关产品推荐
相关产品推荐

