| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- 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()
|