使用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的都写入字符编码,防止中文乱码