使用python编写脚本,一键式导出sql语句执行结果到xls表格中,每条语句结果一个标签页
v1,本地运行
文件列表:
bm.py 主程序
bm_sqlcon.py 数据库连接,查询模块
sql.py 初始化数据库查询语句
xls.py 写入xls文件模块
需要安装第三方模块
easy_install mysql-connector-python
pip install xlwt
实现了结果格式转换,时长计算使用百纳秒到小时:分:秒:帧。设置单元格日期格式,转换数字为汉字说明,设置列宽。
语句未做交互
def s_t(bnm):
bnm=int(bnm)
miao=bnm//10**7
#print(miao)
fen=miao//60
xs=miao//3600
dual=(bnm/10**7-miao)*25
dual=round(dual)
miao=miao%60
fen=fen%60
fh=str(xs)+':'+str(fen)+':'+str(miao)+':'+str(dual)
return fh
v2 版本可以考虑增加网页交互
学到的知识:
1、主函数逻辑:
==》获取查询sql语句,存入字典中。可以使用key为中文的字典,后期直接轮询取key赋值给标签
==》轮询语句字典,取出语句传递给sqlcon模块,执行查询,返回结果是一个包含元组的列表。元组是行信息
==》结果写入字典,进行数据预处理,具体处理调用不同函数,此时遇到一个问题是元组内容是不可变,的所以需要先转成列表,修改完后再转成元组。(如果就用列表应该也可以)
==》传给xls模块,设定单元格属性,加边框,设置列宽,显示方式,写入xls。
2、处理字典数据时,遇到变量类型问题,因为python3是隐式转换格式的,函数传递的数字型的字符串被识别成了数字,
在if语句中与字典中的数字型字符串进行比较判断时,无法通过。最后通过强制转换类型的方式解决。
stat_dict={'20':'编目中','40':'审核中','1000':'完成'}
for k in stat_dict:
#print(key,k,stat_dict[k])
if(k==str(key)):
return stat_dict[k]
包括上面的数字转换函数,也涉及到了类型转换,数字拼接字符串
3、处理字典数据时,因涉及到各种取值 ,各种运算。所以对字典值进行了赋值给另一个变量,
因为字典的值是列表这样的高级数据结构,在直接赋值时,采用的为浅copy方式,结果修改变量的值,原始字典竟然会变化。
如此,猜测浅copy的变量,可以向指针一样使用。
4、处理查询结果时,因为返回的只有结果,没有列名,需要手动增加列名。构造一个含有列名元组的列表,和数据列表进行+的拼接,非常方便。
列名的获取,本来是通过游标的cursor.description获取的,结果获取结果是元组,还有其他信息,这到还能处理,
但是查询语句中带有公式时count(*)这种,就很麻烦,取出的值不是字符串,而是字节码。经过折腾还是没有能统一处理,最后手动构建了列名列表实现
5、数据库操作,可以放到try: except:语句,进行错误处理。而且数据的连接信息,可以写到字典中,通过可变参数传递调用。
try:
conn = mysql.connector.connect(**config)
except mysql.connector.Error as e:
print('open database failed !{} '.format(e))
6、字典初始化时,可以在{中}每个键值对写一行,不需要特殊换行符\
7、分模块编程时,可以在模块中写入test()函数,写入调试数据,对模块进行调试,引入时,这些是不会执行的
8、可以在语句中加入print()函数,输出变量的值,来判断逻辑错误,测试好后可以#注释掉,更换测试条件可以再复制一份,尽量保留测试记录
其他知识:
打开文件时,可以是用with as 方式,进行错误判断
涉及文件操作open的都写入字符编码,防止中文乱码