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

员工薪资管理系统创建表与插入数据功能的替代实现咨询

员工薪资管理自动化工具修复与优化方案

首先,咱们先梳理下原代码里导致功能失效的核心问题:

  • 未处理数据库连接/游标未初始化的情况:如果用户直接选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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 08:33:15