员工薪资管理系统创建表与插入数据功能的替代实现咨询
员工薪资管理自动化工具修复与优化方案
首先,咱们先梳理下原代码里导致功能失效的核心问题:
- 未处理数据库连接/游标未初始化的情况:如果用户直接选3或4,
db和curs变量还没创建,直接调用会抛出NameError - 创建表功能没有实现「免SQL输入」的目标,还是需要用户写完整语法
- 插入数据时,
input()获取的是单个字符串,无法直接作为execute()的参数(需要元组类型),而且硬编码了表和列名,扩展性差
下面是重构后的完整代码,完全实现「仅输入对应值即可操作」的需求:
import mysql.connector as mysql # 初始化全局变量,避免未定义报错 db = None curs = None while True: print("\n=== 员工薪资管理系统 ===") print("1. 连接数据库") print("2. 初始化游标") print("3. 创建薪资表(仅需输入表名和列信息)") print("4. 插入员工薪资数据") print("0. 退出系统") try: a = int(input("请输入操作编号: ")) except ValueError: print("⚠️ 请输入有效的数字编号!") continue if a == 0: # 退出前关闭连接和游标 if curs: curs.close() if db: db.close() print("系统已退出,数据库连接已关闭") break if a == 1: try: db = mysql.connect( host='localhost', user='root', passwd='12345', database='opip' ) print("✅ 数据库连接成功!") except mysql.Error as err: print(f"❌ 连接失败: {err}") elif a == 2: if not db: print("⚠️ 请先执行步骤1连接数据库!") continue try: curs = db.cursor() print("✅ 游标初始化成功!") except mysql.Error as err: print(f"❌ 游标创建失败: {err}") elif a == 3: if not curs: print("⚠️ 请先执行步骤1和2初始化数据库和游标!") continue # 让用户仅输入必要信息,自动生成SQL table_name = input("请输入要创建的表名: ").strip() if not table_name: print("⚠️ 表名不能为空!") continue print("\n请输入列信息(格式:列名 数据类型(长度),例如:id INT(11),输入done结束)") columns = [] while True: col_input = input("输入列信息: ").strip() if col_input.lower() == 'done': break if col_input: columns.append(col_input) if not columns: print("⚠️ 至少需要定义一列!") continue # 自动拼接创建表的SQL create_sql = f"CREATE TABLE IF NOT EXISTS {table_name} ({', '.join(columns)})" try: curs.execute(create_sql) print(f"✅ 表 {table_name} 创建成功!") except mysql.Error as err: print(f"❌ 创建表失败: {err}") elif a == 4: if not curs or not db: print("⚠️ 请先执行步骤1和2初始化数据库和游标!") continue # 让用户指定表名和列,灵活插入数据 table_name = input("请输入要插入数据的表名: ").strip() if not table_name: print("⚠️ 表名不能为空!") continue columns = input("请输入要插入的列名(用逗号分隔,例如:id,Name,Age): ").strip().split(',') columns = [col.strip() for col in columns if col.strip()] if not columns: print("⚠️ 至少需要指定一列!") continue # 根据列数生成占位符 placeholders = ', '.join(['%s'] * len(columns)) insert_sql = f"INSERT INTO {table_name} ({', '.join(columns)}) VALUES ({placeholders})" print(f"\n请输入对应的值(用逗号分隔,数量与列数一致)") data_input = input("输入值: ").strip().split(',') data_input = [val.strip() for val in data_input if val.strip()] if len(data_input) != len(columns): print(f"⚠️ 值的数量与列数不匹配!需要{len(columns)}个值,你输入了{len(data_input)}个") continue # 转换为元组(execute要求的参数格式) data_tuple = tuple(data_input) try: curs.execute(insert_sql, data_tuple) db.commit() print("✅ 数据插入成功!") except mysql.Error as err: db.rollback() # 失败回滚 print(f"❌ 插入数据失败: {err}") else: print("⚠️ 请输入有效的操作编号(0-4)!")
关键优化点说明:
- 避免未定义错误:初始化全局的
db和curs变量,每次操作前先检查是否已初始化,引导用户按步骤操作 - 创建表免SQL输入:用户只需输入表名和列的基本信息,程序自动拼接
CREATE TABLE语句,还加入了IF NOT EXISTS避免重复创建报错 - 插入数据灵活化:支持自定义表名和列,自动生成占位符,同时处理了值的数量匹配问题,失败时自动回滚事务
- 错误处理增强:对数据库操作的异常进行捕获和友好提示,还处理了用户输入非数字的情况
- 退出清理:退出时自动关闭游标和数据库连接,避免资源泄漏
内容的提问来源于stack exchange,提问作者The12th Unique
相关产品推荐
相关产品推荐

