将 Excel 拼接为 SQL 脚本
好像半年前,我就有写过将 Excel 数据, 逐条 或 批量 插入 mysql 数据库, 那时候正在建库嘛, 想着弄个脚本来批量刷新和处理. 工具当时用的 pandas, 这个, 强的一批的工具, 无敌强哦!. 批量导入用 DataFrame.to_sql() 一下子搞定, 课选择是 insert 还是 replace, 确实蛮方便的, 然后逐条就是 用 自己拼接 sql 的方式来一条条导入.
Excel 批量导入Mysql(创建表-追加数据): https://www.cnblogs.com/chenjieyouge/p/11811784.html
Excel 逐条导入Mysql(数据更新): https://www.cnblogs.com/chenjieyouge/p/11812126.html
这都是有控制权的方式下. 但现在我业务中, 我没有执行查询权限的时候, 我总不可能给相关的同事去发代码吧, 因此, 我通常的方式是将数据拼接为一个 sql 脚本, 给相应同事去执行.
需求
将一个 Excel 文件拼接为 sql 脚本 (insert) 进数据库.
思路
就是获取表格的每行, 每列的值, 然后 insert into 表 values (值1, 值2, .....); 存为一个 .sql 的文件, 然后执行这个脚本即可.
不多哔哔, 直接贴上核心代码哦.

栗子
数据预览
还是以我比较熟的 "超市数据" 为例, 这个数据是 Tableau 自带的数据集, 相信如果有用过 Tableau, 就应该对对其非常熟悉了吧, 不熟悉也无妨, 来预览一波这个数据集.

可以看到这个数据集有 9959行, 20个字段. 维度字段(产品, 类别, 字类别, 省, 市, 片区..) 而聚合字段有 销售额, 销量... 还是比较适合用来练习数据分析的哦.
遍历拼接
遍历 DataFrame, 我个人用的最多的, 还是用 iterrows() 的方式. 用 index , value 去 遍历, value 呢, 是一个Series 对象哦, 这就非常灵活了.
df = pd.DataFrame({
'a':[1,2,3],
'b':[4,5,6]
})
print(df)
a b
0 1 4
1 2 5
2 3 6
for _, val in df.iterrows():
print(val)
a 1
b 4
Name: 0, dtype: int64
a 2
b 5
Name: 1, dtype: int64
a 3
b 6
Name: 2, dtype: int64
灵活性就在于遍历的时候, 取值可以 val(0), val(1) ... 也可以 val['a'], val['b'] 想要谁就要谁. 正因为其每行数据作为一个 Series 对象, 那其实只要 调用其 values 属性就全部获取了.
然而我们最后要拼接的 sql 脚本, 要写入文件, 所有的值 必须是字符串, 因此将每个值给强转为字符类型.
val_lst = [str(i) for i in val.values]
这样就变成了, "['a', 'b', 'c'...]" 通过 字符串切片 的方式, 将该字符的首位的 "[", "]" 去掉即可. 需注意的是, 在Python 中 字符串是 不可变对象, 因此修改会返回一个新对象哦.
lst = ['a', 'b', 'c']
lst_str = (str(lst))
print(eval(lst_str[1:-1]))
('a', 'b', 'c')
eval() 和 repr() 这两个"互逆" 内置函数, 虽然原理不难, 在字符处理上, 很多时候还是很香的.
拼接 sql 为文件
def excel_to_sql_script(file_name, out_file_name, tb_name):
import pandas as pd
df = pd.read_excel(file_name)
with open(out_file_name, 'w', encoding='utf-8') as f:
for _, val in df.iterrows():
# 将每行值, 每个元素都转为 str, 整体也套为 str
val_str = str([str(i) for i in val.values])
# 通过切片, 将 "['a', 'b']" => "'a', 'b'" => 再来 eval 就ok了
sql_value = eval(val_str[1:-1])
f.write(f'insert into {tb_name} values {sql_value};' + '\n')
print("ok!")
# test
excel_to_sql_script("D:/test_data/示例 - 超市.xls", "D:/market.sql", "super_market")
win 下 GBK 编码问题:
with open(out_file_name, 'w', encoding='utf-8') , 一定要把这个 encoding='utf-8' 给加上哦
代码运行挺快了, 我这大致1000行嘛, 不到 1s 就读写完毕了, 也可能我新换的电脑比较给力的原因, 总体上也不会很慢的, 笔记就是一个读写文件而已嘛.
预览 sql 脚本
字段太多, 就展示下行数和部分字段啦, 如上代码, 脚本, 存在了我的 "D:/market.sql"
(编辑器用的 sublime , 当然, 用记事本打开也可以, 不过比较丑罢了).

执行 sql 脚本
既然能拼接sql , 自然也是可以自动建表的, 但我没有做这个操作, 嗯, 主要是我觉得, 建表还是手动一个个字段写比较好, 目的是熟悉每个字段名字, 类型. (当然自动也行, 后面整个全自动的).
drop table if exists super_market;
create table super_market(
id int primary key auto_increment,
order_id varchar(30),
order_date datetime,
ship_date datetime, -- 发货日期
ship_mode varchar(30), -- 邮寄方式
customer_id varchar(30),
customer_name varchar(30),
segment varchar(30), -- 细分 (公司, 消费者,微企...)
city varchar(30),
province varchar(20),
country varchar(20),
region varchar(20), -- 片区
product_id varchar(30),
category varchar(30),
sub_category varchar(30), -- 子类别
product_name varchar(50),
sales decimal(8,2),
quantity int,
discount decimal(5,2),
profit decimal(8,2)
);
查看建表:
mysql> desc super_market;
+---------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| order_id | varchar(30) | YES | | NULL | |
| order_date | datetime | YES | | NULL | |
| ship_date | datetime | YES | | NULL | |
| ship_mode | varchar(30) | YES | | NULL | |
| customer_id | varchar(30) | YES | | NULL | |
| customer_name | varchar(30) | YES | | NULL | |
| segment | varchar(30) | YES | | NULL | |
| city | varchar(30) | YES | | NULL | |
| province | varchar(20) | YES | | NULL | |
| country | varchar(20) | YES | | NULL | |
| region | varchar(20) | YES | | NULL | |
| product_id | varchar(30) | YES | | NULL | |
| category | varchar(30) | YES | | NULL | |
| sub_category | varchar(30) | YES | | NULL | |
| product_name | varchar(50) | YES | | NULL | |
| sales | decimal(8,2) | YES | | NULL | |
| quantity | int(11) | YES | | NULL | |
| discount | decimal(5,2) | YES | | NULL | |
| profit | decimal(8,2) | YES | | NULL | |
+---------------+--------------+------+-----+---------+----------------+
20 rows in set (0.00 sec)
然后在命令行, 执行语句:
source D:/market.sql
等一会儿就可以了. (可以看到屏幕在疯狂闪动, 酷酷的), 原理就是一行行地执行 sql 语句而已呀.

小结
- 读取文件用的 pandas, 遍历用了 df.iterrows(). 每行会被当做 Series 对象, 下标和key 的方式都可以取值
- win下的文件读写bug, 对于中文编码错误, 一定要在 open 内 传入 encoding="utf-8"
- 拼接 sql, 可以先将其全转为 str, 然后通过 切片 sql_str[1:-1] 取出 列表中的元素.
最后想了下, 自动把表也给建号, 作为一个可选参数, 然后将这个应用 打包成 exe 文件, 也是可以的. 后面看有需要就弄一个吧, 无妨.
将 Excel 拼接为 SQL 脚本的更多相关文章
- 读取excel数据生成sql脚本
package com.interact.util; import jxl.Cell; import jxl.Sheet; import jxl.Workbook; import jxl.read.b ...
- 通过Excel表创建sql脚本
Excel.sql脚本 1)准备好存有数据的excel表格: 这里我们有些小技巧可以让表下面和右边的表格隐藏,在第8行的位置按住“Ctrl+Shift+↓”可以选定下面的空格,然后鼠标右键 隐藏即可, ...
- 将EXCEL中的列拼接成SQL insert插入语句
工作中经常需要将EXCEL文件中的数据导入到各种数据库,但是对于不熟悉数据库的人来说,如果直接使用命令执行导入,这无疑是一个难题,也是一个风险.这里我们直接在EXCEL文件中拼接成标准的SQL ins ...
- Excel数据转化为sql脚本
在实际项目开发中,有时会遇到客户让我们把大量Excel数据导入数据库的情况.这时我们就可以通过将Excel数据转化为sql脚本来批量导入数据库. 1 在数据前插入一列单元格,用来拼写sql语句. 具体 ...
- [转]Excel数据转化为sql脚本
在实际项目开发中,有时会遇到客户让我们把大量Excel数据导入数据库的情况.这时我们就可以通过将Excel数据转化为sql脚本来批量导入数据库. 1 在数据前插入一列单元格,用来拼写sql语句. 具体 ...
- 通过Excel生成批量SQL语句
项目中有时会遇到这样的要求:用户给发过来一些数据,要我们直接给存放到数据库里面,有的是Insert,有的是Update等等,少量的数据我们可以采取最原始的办法,也就是在SQL里面用Insert int ...
- MySQLdump导出sql脚本
1.问题描述 通过图形化工具,在查询窗口用select语句按条件查询出所需结果,然后用“导出向导”把查询结果导成sql文件,但是导出来的sql语句不全,没有表名.字段名. 通过图形化工具,试了好多次都 ...
- MySQL学习之路(1):SQL脚本语言
使用MySQL数据库,首先安装MySQL数据库,本文所有SQL脚本在MySQL上测试和执行. 安装Mysql服务器:安装Mysql workbench客户端,可以以图形化界面管理mysql:安装php ...
- Oracle SQL 脚本跟踪
NC Oracle SQL 脚本跟踪 脚本: select * from v$sqlarea a and a.LAST_ACTIVE_TIME >= to_date( '2013-02-21 1 ...
- excel数据生成sql insert语句
excel数据生成sql insert语句 excel表格中有A.B.C三列数据,希望导入到数据库users表中,对应的字段分别是name,sex,age . 在你的excel表格中增加一列,利用ex ...
随机推荐
- Deepseek学习随笔(5)--- DeepSeek 在职场中的应用
自动化办公 在职场中,DeepSeek 可以帮助自动化办公流程,如生成日报.撰写邮件等: 日报生成:请根据今日工作内容生成一份日报 DeepSeek 会生成一份简洁的工作日报,帮助你总结当天的工作内容 ...
- 雷电4扩展坞HDMI显示器无法睡眠问题
背景: 最近使用Dell的雷电4扩展坞WD22TB4,感觉很爽,取电脑时,不用再拔显示器.鼠标.键盘,直接把雷电4接口拔出即可. 后来通过windows update升级了intel显卡驱动后,发现电 ...
- 开启 Typecho 的 gzip 压缩
简介 GZip压缩,是一种网站速度优化技术,也是一把SEO优化利器,许多网站都采用了这种技术,以达到提升网页打开速度.缩短网页打开时间的目的. 网站采用Gzip压缩,还有一个好处,就是让你少了一份流量 ...
- HDP集群部署
一.环境准备 centos7 安装和系统环境处理 1)运行初始化脚本 !/bin/bash ------------------------------------- 系统环境初始化脚本 本脚本仅支持 ...
- Top-N推荐算法 Top-N recommendation Algorithms
引言 推荐算法是计算机专业中的一种算法,通过一些计算,能够推测用户喜欢的东西,在互联网环境中应用比较广泛.Top-N算法在生活中非常常见,比如学术论文推荐论文.音乐软件推荐歌曲等. 今天看到一篇名叫& ...
- 面试题55 - I. 二叉树的深度
地址:https://leetcode-cn.com/problems/er-cha-shu-de-shen-du-lcof/ <?php /** 面试题55 - I. 二叉树的深度 输入一棵二 ...
- [解决方案]Refusing to install package with name "codemirror" under a package
前言 安装codeMirror,报错了 报错信息:Refusing to install package with name "codemirror" under a packag ...
- .net core 非阻塞的异步编程 及 线程调度过程
本文主要分为三个部分: 1.语法格式 2.线程调度情况 3.编程注意事项 4.练一练 * 阅读提示 :鼠标悬停在 章节标题 上可见 文章目录 异步编程(Task Asynchronous Progra ...
- FastAPI 错误处理与自定义错误消息完全指南:构建健壮的 API 应用 🛠️
title: FastAPI 错误处理与自定义错误消息完全指南:构建健壮的 API 应用 ️ date: 2025/3/12 updated: 2025/3/12 author: cmdragon e ...
- mac mamp php扩展安装
官网下载需要开启的php扩展 PHP扩展下载官网地址 解压扩展包,指定mamp所使用的php版本的phpize编译安装 # 在解压的扩展包中执行以下命令 /Applications/MAMP/bin/ ...