找回密码
 立即注册
搜索
热搜: Excel discuz
查看: 4|回复: 3

斑马数据库

[复制链接]

505

主题

7万

元宝

80万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
806076
发表于 昨天 19:20 | 显示全部楼层 |阅读模式
本地有一个excel表,想导入数据库,用python操作步骤:
一、用python连接本地数据库,然后新建shuju表。
  1. import pymysql
  2. host = 'localhost'
  3. port = 3306
  4. user = 'root'
  5. psd = '12345678'
  6. db = 'banma'
  7. charset = 'utf8'
  8. db = pymysql.Connect(host=host,port=port,user=user,passwd=psd,db=db,charset=charset)
  9. print('OK--连接成功')

  10. cursor = db.cursor()   #创建游标对象,用于数据库查询结果以及执行SQL语句
  11. # sql = 'CREATE TABLE test(id int,name varchar(10),age int);'

  12. sql = 'CREATE TABLE shuju(riqi date, field1 varchar(200), field2 varchar(200), field3 varchar(200), field4 varchar(200));'

  13. cursor.execute(sql)   #执行sql语句
  14. db.commit()    #提交
  15. cursor.close()    #关闭游标对象


  16. db.close()   #关闭数据库连接,不然会一直占用计算机资源
复制代码




回复

使用道具 举报

505

主题

7万

元宝

80万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
806076
 楼主| 发表于 昨天 19:21 | 显示全部楼层
二、用python读取excel,然后插入到数据库
  1. import pandas as pd
  2. import pymysql
  3. import numpy as np
  4. from datetime import datetime


  5. def insert_excel_to_mysql_complete():
  6.     """
  7.     完整的Excel导入MySQL程序
  8.     """
  9.     # ========== 配置参数 ==========
  10.     excel_path = 'd:\\210750.xlsx'  # 修改为你的Excel文件路径
  11.     host = 'localhost'
  12.     user = 'root'
  13.     password = '12345678'  # 修改为你的密码
  14.     database = 'banma'  # 你的数据库名是banma
  15.     table_name = 'shuju'
  16.     port = 3306

  17.     connection = None

  18.     try:
  19.         # ========== 1. 读取Excel ==========
  20.         print("=" * 60)
  21.         print("步骤1: 读取Excel文件")
  22.         print("=" * 60)
  23.         df = pd.read_excel(excel_path)
  24.         print(f"✅ 读取成功: {len(df)} 行数据")
  25.         print(f"列名: {df.columns.tolist()}")
  26.         print(f"\n前3行原始数据:")
  27.         print(df.head(3))

  28.         # ========== 2. 数据清洗和转换 ==========
  29.         print("\n" + "=" * 60)
  30.         print("步骤2: 数据清洗和转换")
  31.         print("=" * 60)

  32.         # 处理日期列
  33.         if 'riqi' in df.columns:
  34.             print("处理日期列...")
  35.             # 查看日期列原始数据
  36.             print(f"日期列原始数据类型: {df['riqi'].dtype}")
  37.             print(f"日期列前5个值:\n{df['riqi'].head()}")

  38.             # 转换为日期格式
  39.             df['riqi'] = pd.to_datetime(df['riqi'], errors='coerce')
  40.             # 只保留日期部分
  41.             df['riqi'] = df['riqi'].dt.date
  42.             print(f"转换后日期列前5个值:\n{df['riqi'].head()}")

  43.         # 处理其他文本字段(确保是字符串类型)
  44.         text_fields = ['field1', 'field2', 'field3', 'field4']
  45.         for field in text_fields:
  46.             if field in df.columns:
  47.                 # 转换为字符串,NaN保持为NaN
  48.                 df[field] = df[field].astype(object)

  49.         # 将NaN转换为None(MySQL的NULL)
  50.         df = df.where(pd.notna(df), None)

  51.         print(f"\n清洗后的前3行数据:")
  52.         print(df.head(3))

  53.         # ========== 3. 准备插入数据 ==========
  54.         print("\n" + "=" * 60)
  55.         print("步骤3: 准备插入数据")
  56.         print("=" * 60)

  57.         # 转换为列表格式
  58.         data_list = df.values.tolist()
  59.         print(f"准备插入 {len(data_list)} 行数据")
  60.         print(f"第1行数据示例: {data_list[0] if data_list else '无数据'}")

  61.         # 检查是否有空数据
  62.         empty_count = sum(1 for row in data_list if all(v is None for v in row))
  63.         if empty_count > 0:
  64.             print(f"⚠️ 警告: 有 {empty_count} 行全为空数据")

  65.         # ========== 4. 连接数据库并插入 ==========
  66.         print("\n" + "=" * 60)
  67.         print("步骤4: 连接数据库并插入数据")
  68.         print("=" * 60)

  69.         connection = pymysql.connect(
  70.             host=host,
  71.             user=user,
  72.             password=password,
  73.             database=database,
  74.             port=port,
  75.             charset='utf8mb4'
  76.         )
  77.         print("✅ 数据库连接成功")

  78.         with connection.cursor() as cursor:
  79.             # 检查表是否存在
  80.             cursor.execute(f"SHOW TABLES LIKE '{table_name}'")
  81.             if not cursor.fetchone():
  82.                 print(f"❌ 错误: 表 {table_name} 不存在")
  83.                 return

  84.             # 查看插入前的记录数
  85.             cursor.execute(f"SELECT COUNT(*) FROM {table_name}")
  86.             before_count = cursor.fetchone()[0]
  87.             print(f"插入前表中有 {before_count} 条记录")

  88.             # 构建INSERT语句
  89.             columns = ['riqi', 'field1', 'field2', 'field3', 'field4']
  90.             placeholders = ', '.join(['%s'] * len(columns))
  91.             sql = f"INSERT INTO {table_name} ({', '.join(columns)}) VALUES ({placeholders})"
  92.             print(f"SQL语句: {sql}")

  93.             # 逐行插入(便于调试)
  94.             success_count = 0
  95.             error_count = 0

  96.             for idx, row in enumerate(data_list):
  97.                 try:
  98.                     # 确保row有5个元素
  99.                     if len(row) != 5:
  100.                         print(f"⚠️ 第{idx + 1}行数据长度不正确: {len(row)},跳过")
  101.                         error_count += 1
  102.                         continue

  103.                     # 执行插入
  104.                     cursor.execute(sql, row)
  105.                     success_count += 1

  106.                     # 每100行提交一次
  107.                     if success_count % 100 == 0:
  108.                         connection.commit()
  109.                         print(f"已插入 {success_count}/{len(data_list)} 行")

  110.                 except Exception as e:
  111.                     print(f"❌ 第{idx + 1}行插入失败: {e}")
  112.                     print(f"   数据: {row}")
  113.                     error_count += 1
  114.                     continue

  115.             # 提交剩余数据
  116.             connection.commit()
  117.             print(f"\n✅ 成功插入 {success_count} 行")
  118.             if error_count > 0:
  119.                 print(f"❌ 失败 {error_count} 行")

  120.             # 验证插入结果
  121.             cursor.execute(f"SELECT COUNT(*) FROM {table_name}")
  122.             after_count = cursor.fetchone()[0]
  123.             print(f"\n插入后表中有 {after_count} 条记录")
  124.             print(f"实际增加: {after_count - before_count} 条")

  125.             # 显示刚插入的数据
  126.             if after_count > before_count:
  127.                 cursor.execute(f"SELECT * FROM {table_name} LIMIT 5")
  128.                 sample_data = cursor.fetchall()
  129.                 print(f"\n表中前5条数据:")
  130.                 for row in sample_data:
  131.                     print(f"  {row}")

  132.     except FileNotFoundError:
  133.         print(f"❌ 错误: 找不到文件 {excel_path}")
  134.         print("请确认文件路径是否正确")
  135.     except pymysql.Error as e:
  136.         print(f"❌ 数据库错误: {e}")
  137.         if connection:
  138.             connection.rollback()
  139.     except Exception as e:
  140.         print(f"❌ 其他错误: {e}")
  141.         import traceback
  142.         traceback.print_exc()
  143.     finally:
  144.         if connection:
  145.             connection.close()
  146.             print("\n数据库连接已关闭")
  147.         print("=" * 60)


  148. # ========== 运行程序 ==========
  149. if __name__ == "__main__":
  150.     insert_excel_to_mysql_complete()
复制代码




回复

使用道具 举报

505

主题

7万

元宝

80万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
806076
 楼主| 发表于 昨天 19:21 | 显示全部楼层
210750.xlsx (20.64 KB, 下载次数: 0)
回复

使用道具 举报

505

主题

7万

元宝

80万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
806076
 楼主| 发表于 昨天 19:22 | 显示全部楼层

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|五花八门论坛 ( 豫ICP备15031300号-3 )

GMT+8, 2026-4-10 10:01 , Processed in 0.071453 second(s), 31 queries .

本站已稳定运营:

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表