import pymysql import pandas as pd import time from pymysql.err import OperationalError, ProgrammingError, DataError # -------------------------- 你的配置信息(已保留,无需修改) -------------------------- DB_CONFIG = { "host": "127.0.0.1", # 数据库地址,本地一般是127.0.0.1 "port": 3306, # 数据库端口,默认3306 "user": "root", # 数据库用户名 "password": "root", # 数据库密码 "database": "recycle", # 替换为price_option_factor表所在的数据库名 "charset": "utf8mb4" } CSV_FILE_PATH = "deduction_ratio.csv" # CSV文件路径,若不在同目录则写绝对路径 # --------------------------------------------------------------------------------------- def insert_csv_to_mysql(): # 1. 读取CSV文件,仅保留需要的option_id和factor字段 try: df = pd.read_csv(CSV_FILE_PATH, usecols=["option_id", "factor"]) # 转换数据类型(匹配数据库字段,option_id为bigint,factor为decimal) df["option_id"] = df["option_id"].astype(int) df["factor"] = df["factor"].astype(float) if df.empty: print("CSV文件中无有效数据,无需插入") return except FileNotFoundError: print(f"错误:未找到CSV文件,路径为{CSV_FILE_PATH}") return except Exception as e: print(f"读取CSV文件失败:{str(e)}") return # 生成当前时间(MySQL datetime格式:YYYY-MM-DD HH:MM:SS),同批次数据时间一致 current_time = time.strftime("%Y-%m-%d %H:%M:%S") # ✅ 修复:普通元组通过索引取值(0=option_id,1=factor),这是报错的核心解决点 data_list = [ (row[0], row[1], current_time, current_time) for row in df.itertuples(index=False, name=None) ] # 2. 连接数据库并批量插入数据 conn = None cursor = None try: # 建立数据库连接 conn = pymysql.connect(**DB_CONFIG) cursor = conn.cursor() # 插入SQL语句:新增create_time、update_time字段手动写入 insert_sql = """ INSERT INTO price_option_factor (option_id, factor, create_time, update_time) VALUES (%s, %s, %s, %s) """ # 批量执行插入(效率高于单条插入) cursor.executemany(insert_sql, data_list) # 提交事务 conn.commit() print(f"成功插入{cursor.rowcount}条数据到price_option_factor表,时间统一为:{current_time}") except OperationalError: print("数据库连接失败:请检查host/port/user/password/database是否正确") except ProgrammingError as e: print(f"SQL执行错误:表不存在或字段名错误,详情:{str(e)}") except DataError: print("数据类型错误:CSV中的数据超出数据库字段的取值范围(如factor超出decimal(5,4))") except Exception as e: # 出错时回滚事务 if conn: conn.rollback() print(f"插入数据失败:{str(e)}") finally: # 关闭游标和连接(无论是否出错都执行) if cursor: cursor.close() if conn: conn.close() if __name__ == "__main__": insert_csv_to_mysql()