如何将excel数据快速导入数据库

最近老是收到一些手工数据,并且需要关联分析,就想到如何快速将数据导入数据库后关联查询输出结果,下面是一段将excel数据写入mysql的脚本,欢迎大家提出优化意见相互学习。

python 复制代码
import os
import pandas as pd
import pymysql
import numpy as np
from dotenv import load_dotenv, find_dotenv

# ✅ 加载 config.env 文件
env_path = find_dotenv(filename="config.env")
if not env_path:
    raise FileNotFoundError("❌ 未找到 config.env 文件,请确保它与脚本在同一目录下")
load_dotenv(env_path)

# ✅ 获取环境变量
excel_path = os.getenv("EXCEL_PATH")
db_host = os.getenv("DB_HOST")
db_user = os.getenv("DB_USER")
db_password = os.getenv("DB_PASSWORD")
db_name = os.getenv("DB_NAME")
table_name = os.getenv("DB_TABLE")

# ✅ 打印调试信息(可注释)
print("📄 Excel 路径:", excel_path)
print("📦 数据库:", db_name, "| 表名:", table_name)

# ✅ 检查路径是否存在
if not excel_path or not os.path.exists(excel_path):
    raise ValueError("❌ Excel 路径无效,请检查 EXCEL_PATH 配置和文件是否存在")

# ✅ 读取 Excel 文件
df = pd.read_excel(excel_path)
print(f"✅ 成功读取 Excel,共 {len(df)} 行")

# ✅ 替换 NaN 和 NaT 为 None,确保兼容 pymysql
df = df.replace({np.nan: None, pd.NaT: None})
# 或者:df = df.applymap(lambda x: None if pd.isna(x) else x)

# ✅ 连接 MySQL 数据库
conn = pymysql.connect(
    host=db_host,
    user=db_user,
    password=db_password,
    database=db_name,
    charset='utf8mb4'
)
cursor = conn.cursor()

# ✅ 构造 INSERT SQL
cols = ",".join([f"`{col}`" for col in df.columns])
placeholders = ",".join(["%s"] * len(df.columns))
insert_sql = f"INSERT INTO `{table_name}` ({cols}) VALUES ({placeholders})"

# ✅ 插入数据
try:
    cursor.executemany(insert_sql, df.values.tolist())
    conn.commit()
    print(f"✅ 成功插入 {cursor.rowcount} 行数据到表 `{table_name}`")
except Exception as e:
    conn.rollback()
    print("❌ 插入数据失败:", str(e))

    # 可选:定位第几行出错(调试用)
    for i, row in enumerate(df.values.tolist()):
        try:
            cursor.execute(insert_sql, row)
        except Exception as err:
            print(f"⚠️ 第 {i} 行插入失败:{err}")
            print("🧪 数据内容:", row)
            break
finally:
    cursor.close()
    conn.close()
    print("🔚 数据库连接已关闭")
相关推荐
得物技术1 小时前
MySQL单表为何别超2000万行?揭秘B+树与16KB页的生死博弈|得物技术
数据库·后端·mysql
可涵不会debug5 小时前
【IoTDB】时序数据库选型指南:工业大数据场景下的技术突围
数据库·时序数据库
ByteBlossom5 小时前
MySQL 面试场景题之如何处理 BLOB 和CLOB 数据类型?
数据库·mysql·面试
麦兜*5 小时前
MongoDB Atlas 云数据库实战:从零搭建全球多节点集群
java·数据库·spring boot·mongodb·spring·spring cloud
Slaughter信仰5 小时前
深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)第十章知识点问答(10题)
java·jvm·数据库
麦兜*5 小时前
MongoDB 在物联网(IoT)中的应用:海量时序数据处理方案
java·数据库·spring boot·物联网·mongodb·spring
-Xie-6 小时前
Mysql杂志(十六)——缓存池
数据库·mysql·缓存
七夜zippoe6 小时前
缓存与数据库一致性实战手册:从故障修复到架构演进
数据库·缓存·架构
一个天蝎座 白勺 程序猿6 小时前
Apache IoTDB(5):深度解析时序数据库 IoTDB 在 AINode 模式单机和集群的部署与实践
数据库·apache·时序数据库·iotdb·ainode