我们项目组是老系统快10年了!随着业务的增长,已经不能满足业务的发展了!另外一个组要重新架构和开发我们的系统,但是数据库要参照我们的进行设计。让我导出数据表结构,好几百个表让我搞,我也不知道怎么弄啊!正好我的本地装有python 环境一气之下用半个小时 写了段代码,然后怒怼他以后你这活自己干行不行!别烦我!
既然写了就发出来给大家看一下!python 实现的 数据库 db2 !
下面看看一下怎么实现的:
依赖两个库:ibm_db、openpyxl、
我们的数据库是db2 的这个包不太好找 !家里电脑上没有安装这两个库所以 图片上报错!
直接上代码:图片和代码都有如下
![0ebf0ea527c891bcd657466da0c43583.png](https://i-blog.csdnimg.cn/blog_migrate/d97a1c7c91463cc760a38f9455165d86.jpeg)
![13a5f777730464ec4b9feb2056d52712.png](https://i-blog.csdnimg.cn/blog_migrate/59485c7756369499dd22037d15cdf128.jpeg)
![3d5d8506308d54cb839598314e631d01.png](https://i-blog.csdnimg.cn/blog_migrate/860f9b88b68c0d9e6877da8988d232fd.jpeg)
![f0887c04137fa9124f2682874175d2ec.png](https://i-blog.csdnimg.cn/blog_migrate/7600ce1a57664b0b3b825a2b996a36cc.jpeg)
# coding: utf-8import ibm_dbimport openpyxlfrom openpyxl.styles import Font, colors, Alignment'''功能:导出db2数据库当中表结构 依赖包: openpyxl-2.6.2.tar ibm_db-3.0.1.tar'''# FT 环境 数据库地址和密码我都改掉了!connStr = "DATABASE=SCFDB;HOSTNAME=127.0.0.1;PORT=50000;PROTOCOL=TCPIP;UID=abc;PWD=123456"conn = Nonetry: conn = ibm_db.connect(connStr, "", "") # 从系统表中systables 获取 type 为 T creator 为 scf 的表名 sqlTblNm = "select NAME,REMARKS from sysibm.systables where type='T' and creator='SCF' and LENGTH(NAME)<40" print('------BEGIN:导出表结构程序开始------') print('------获取SCF数据库表名------') stmt_sqlTblNm = ibm_db.exec_immediate(conn, sqlTblNm) resTblNm = ibm_db.fetch_both(stmt_sqlTblNm) # 创建第一个sheet 数据库表索引页 设置表格样式 wb = openpyxl.Workbook() bold_13_font = Font(size=13, bold=True) ws1 = wb.active ws1['A1'] = 'NAME' ws1['B1'] = 'REMARKS' ws1['A1'].font = bold_13_font ws1['B1'].font = bold_13_font ws1.title = "索引页" rtn = 1 # 开始循环 while (resTblNm): rtn += 1 # 根据表名字在系统表syscolumns查询列信息 sqlTblCrt = "select COLNO,TBNAME,NAME,REMARKS,COLTYPE,LENGTH,SCALE,NULLS from sysibm.syscolumns where tbname ='%s' order by COLNO" % ( resTblNm[0]) print(resTblNm[0]) stmt_sqlTblCrt = ibm_db.exec_immediate(conn, sqlTblCrt) resTblCrt = ibm_db.fetch_both(stmt_sqlTblCrt) # 给索引页 的两个列赋值 表名及表描述 ws1.cell(row=rtn, column=1, value=resTblNm[0]) ws1.cell(row=rtn, column=2, value=resTblNm[1]) # 此处提示不必在意:sheet页title不能由长度显示大于31字符会自动截取。 if len(resTblNm[0]) > 31: print("WARNING:++表名字长度大于sheet的title限长(31),自动截取31个字符命名!") print(resTblNm[0]) print("WARNING:表名字太长") # 创建新的sheet页 ws = wb.create_sheet() # 设置列名字及sheet页的title ws.title = resTblNm[0] ws['A1'] = 'COLNO' # 序号 ws['B1'] = 'TBNAME' # 表名 ws['C1'] = 'NAME' # 列名 ws['D1'] = 'REMARKS' # 描述 ws['E1'] = 'COLTYPE' # 类型 ws['F1'] = 'LENGTH' # 长度 ws['G1'] = 'SCALE' # 精确位数 ws['H1'] = 'NULLS' # 是否为空 ws['A1'].font = bold_13_font ws['B1'].font = bold_13_font ws['C1'].font = bold_13_font ws['D1'].font = bold_13_font ws['E1'].font = bold_13_font ws['F1'].font = bold_13_font ws['G1'].font = bold_13_font ws['H1'].font = bold_13_font r = 1 while (resTblCrt): r += 1 ws.cell(row=r, column=1, value=resTblCrt[0] + 1) ws.cell(row=r, column=2, value=resTblCrt[1]) ws.cell(row=r, column=3, value=resTblCrt[2]) ws.cell(row=r, column=4, value=resTblCrt[3]) ws.cell(row=r, column=5, value=resTblCrt[4]) ws.cell(row=r, column=6, value=resTblCrt[5]) ws.cell(row=r, column=7, value=resTblCrt[6]) ws.cell(row=r, column=8, value=resTblCrt[7]) # db2不能一次取出数据集合需要while 依次取出 resTblCrt = ibm_db.fetch_both(stmt_sqlTblCrt) resTblNm = ibm_db.fetch_both(stmt_sqlTblNm) print("导出表的个数:" + str(rtn - 1)) print("保存文件:D:python数据库表结构_测试导出.xlsx") # 保存为xlsx文件 wb.save('D:python数据库表结构_测试导出.xlsx')except Exception as ex: print(ex)finally: ibm_db.free_stmt(stmt_sqlTblNm) ibm_db.free_stmt(stmt_sqlTblCrt) ibm_db.close(conn) print('------END:导出表结构结束------')
下面看一下运行情况:执行 python db2conn.py
![ef012e7458d86ede8d3ce9c2b96fbbf0.png](https://i-blog.csdnimg.cn/blog_migrate/baab1c08d047baa8fb2e71b0dcb62be8.jpeg)
开始执行:python db2conn.py
![911c34fedb93410ef38535e9173efa73.png](https://i-blog.csdnimg.cn/blog_migrate/3863d792afaa18d099bf0a314dcad7db.jpeg)
导出完成了!
我们在看一下导出数据:
![9d8643bc501b555ba0baaae4a0e84e86.png](https://i-blog.csdnimg.cn/blog_migrate/7563b46cc7e2782f86aba59908042919.jpeg)
这是表的索引页
![568704c7f927083fb0e8770694f0dc10.png](https://i-blog.csdnimg.cn/blog_migrate/ce7d6c1f8fe3e0f6a88017cd2b2ff11f.jpeg)
表结构的sheet页
以后再让我导出数据库表结构我就能一下子导出了!需要这段代码的小伙伴可以私信我!