Python实现Excel数据高效存入MySQL数据库的方法
一些基础的操作吧
一、准备工作
在开始之前,确保您已经安装了以下必要的工具和库:
- Python环境:建议使用Python 3.x版本。
- MySQL数据库:确保MySQL服务正在运行,并且您有足够的权限进行数据操作。
- 必要的Python库:
pymysql:用于连接和操作MySQL数据库。pandas:用于数据分析和处理。
二、连接MySQL数据库
首先,我们需要编写代码来连接MySQL数据库。以下是一个示例代码:
# 数据库配置
DB_CONFIG = { 'host': 'localhost',
'port': 3306,
'user': 'root',
'password': '@@@@',
'db': 'test',
'charset': 'utf8' }
# 动态创建 MySQL 表
def create_table(conn, table_name: str, columns: List[str], dtypes: Dict[str, str]):
with conn.cursor() as cursor:
# 构建 SQL 语句
columns_with_types = [f"`{col}` {dtypes[col]}" for col in columns]
sql = f"CREATE TABLE IF NOT EXISTS {table_name} (id INT AUTO_INCREMENT PRIMARY KEY, {', '.join(columns_with_types)})"
# 执行 SQL 语句
cursor.execute(sql)
print(f"表 {table_name} 创建成功")
# 连接 MySQL 数据库 conn = pymysql.connect(**DB_CONFIG)
三、读取Excel文件
接下来,我们需要读取Excel文件中的数据。以下是一个示例代码:
# 读取 Excel 文件
def read_excel(file_path: str) -> pd.DataFrame:
# 读取 Excel 文件
df = pd.read_excel(file_path)
# 打印前 5 行数据
print("Excel 数据预览:")
print(df.head())
return df
四、将数据导入MySQL表
最后,我们将读取到的数据导入到MySQL表中。以下是一个示例代码:
# 插入数据
def insert_data(conn, table_name: str, data: List[Dict]):
with conn.cursor() as cursor:
# 构建 SQL 语句
columns = data[0].keys()
placeholders = ', '.join(['%s'] * len(columns))
sql = f"INSERT IGNORE INTO {table_name} ({', '.join(columns)}) VALUES ({placeholders})"
# 插入数据
for row in data:
values = tuple(row.values())
cursor.execute(sql, values)
print(f"数据插入成功,共插入 {len(data)} 条记录")
五、完整代码示例
将上述步骤整合到一个完整的脚本中,以下是一个完整的示例代码:
import pymysql
import pandas as pd
from typing import List, Dict
# *******************************************************
# * 将 Excel 文件中的数据插入到 MySQL 数据库中
# *****************************************************
# 数据库配置
DB_CONFIG = {
'host': 'localhost',
'port': 3306,
'user': 'root',
'password': '@@@@',
'db': 'test',
'charset': 'utf8'
}
# Excel 文件路径
EXCEL_FILE = r'C:\Users\ger\Desktop\20250105192033.xlsx' # 替换为你的 Excel 文件路径
# 目标表名
TABLE_NAME = 'excel_data' # 替换为你的目标表名
# 读取 Excel 文件
def read_excel(file_path: str) -> pd.DataFrame:
# 读取 Excel 文件
df = pd.read_excel(file_path)
# 打印前 5 行数据
print("Excel 数据预览:")
print(df.head())
return df
# 动态创建 MySQL 表
def create_table(conn, table_name: str, columns: List[str], dtypes: Dict[str, str]):
with conn.cursor() as cursor:
# 构建 SQL 语句
columns_with_types = [f"`{col}` {dtypes[col]}" for col in columns]
sql = f"CREATE TABLE IF NOT EXISTS {table_name} (id INT AUTO_INCREMENT PRIMARY KEY, {', '.join(columns_with_types)})"
# 执行 SQL 语句
cursor.execute(sql)
print(f"表 {table_name} 创建成功")
# 插入数据
def insert_data(conn, table_name: str, data: List[Dict]):
with conn.cursor() as cursor:
# 构建 SQL 语句
columns = data[0].keys()
placeholders = ', '.join(['%s'] * len(columns))
sql = f"INSERT IGNORE INTO {table_name} ({', '.join(columns)}) VALUES ({placeholders})"
# 插入数据
for row in data:
values = tuple(row.values())
cursor.execute(sql, values)
print(f"数据插入成功,共插入 {len(data)} 条记录")
# 主函数
def main():
# 读取 Excel 文件
df = read_excel(EXCEL_FILE)
# 将 NaN 替换为 0
df = df.fillna(0)
# 动态生成列名和数据类型
columns = df.columns.tolist()
dtypes = {
col: 'VARCHAR(255)' if df[col].dtype == 'object' else 'INT' if df[col].dtype == 'int64' else 'FLOAT'
for col in columns
}
# 连接 MySQL 数据库
conn = pymysql.connect(**DB_CONFIG)
try:
# 创建表
create_table(conn, TABLE_NAME, columns, dtypes)
# 将 DataFrame 转换为字典列表
data = df.to_dict(orient='records')
# 插入数据
insert_data(conn, TABLE_NAME, data)
# 提交事务
conn.commit()
except Exception as e:
# 回滚事务
conn.rollback()
print(f"发生错误: {e}")
finally:
# 关闭连接
conn.close()
# 运行程序
if __name__ == '__main__':
main()
更多精彩内容https://mp.weixin.qq.com/s/p4R7IA1ADsqi1J9vOL63Cg?payreadticket=HJPJ07g452MSffzV5HTLdrcZPUZ77pcbggzq7_Cmw6qTF6646DBGWHAG490sKon-9KI5yQg&poc_token=HL9P72ej8Sf-aDPRxlRr5A3ys2hQHw1ZSATvf-Pz
作者:qweqwety