目录
- excel转sql的insert语句
- 一、背景
- 二、直接上代码
excel转sql的insert语句
一、背景
在实际测试工作中,需要频繁地进行测试造数并插入数据库验证,常规的手写sql语句过于浪费时间,为此简单写个脚本,通过excel来造数,快速生成insert语句,以此提高测试效率。
二、直接上代码
- 代码如下:
import pandas as pd
import pyperclip
import traceback
import os
class SourceData:
def __init__(self, path, sheet_name, engine=None):
# 通过pandas读取excel文件的指定sheet页,过滤掉为空的表头
self.df = pd.DataFrame(pd.read_excel(path, sheet_name=sheet_name, dtype='string', na_filter=False,
usecols=lambda x: not x.startswith('Unnamed'), engine=engine))
self.data = self.df.iloc[:, 1:] # 读取数据主体
self.table_name = self.df['table_name'][0] # 读取要造数的表名
def to_sql(self):
keys = '("' + '","'.join(list(map(lambda x: x.strip(), self.data.columns.to_list()))) + '")' # 拼接sql语句的keys部分
table_name = self.table_name
values = ','.join(
map(lambda x: "('" + "','".join(x) + "')", self.data.to_records(index=False).tolist())) # 拼接sql语句的values部分
sql = ' '.join(['INSERT INTO', table_name, keys, 'VALUES', values]) + ';' # 构造insert语句
print(sql) # 打印到交互窗口
pyperclip.copy(sql) # 复制到剪贴板,以便直接进行粘贴
if __name__ == '__main__':
while True:
path = input('请输入源数据文件路径:')
if not os.path.exists(path): # 文件错误时不退出,而是重新输入
print('文件不存在,请检查路径后重新输入!')
continue
else:
while True:
sheet_name = input('请输入sheet_name:')
try:
obj = SourceData(path, sheet_name)
obj.to_sql()
except Exception as msg:
print(traceback.format_exc())
continue
-
excel造数模板如下
由于sheet页名称有长度限制,所以只有将表名放于主体区域::
-
执行结果如下:
先指定excel路径,后面会进入到sheet名称读取的循环中,可以在一个excel文件里面建多个表的造数sheet。
转换结果会打印出来,但用户不需要再去选中复制,因为这里用了pyperclip模块,在代码中已经复制到剪贴板了,可以直接粘贴使用
由于功能简单,所以就不做界面了