db2 查看表结构_项目经理让我导出数据库表结构!我怒怼他:以后这活你自己干

我们项目组是老系统快10年了!随着业务的增长,已经不能满足业务的发展了!另外一个组要重新架构和开发我们的系统,但是数据库要参照我们的进行设计。让我导出数据表结构,好几百个表让我搞,我也不知道怎么弄啊!正好我的本地装有python 环境一气之下用半个小时 写了段代码,然后怒怼他以后你这活自己干行不行!别烦我!

既然写了就发出来给大家看一下!python 实现的 数据库 db2 !

下面看看一下怎么实现的:

依赖两个库:ibm_db、openpyxl、

我们的数据库是db2 的这个包不太好找 !家里电脑上没有安装这两个库所以 图片上报错!

直接上代码:图片和代码都有如下

0ebf0ea527c891bcd657466da0c43583.png
13a5f777730464ec4b9feb2056d52712.png
3d5d8506308d54cb839598314e631d01.png
f0887c04137fa9124f2682874175d2ec.png
# 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

开始执行:python db2conn.py

911c34fedb93410ef38535e9173efa73.png

导出完成了!

我们在看一下导出数据:

9d8643bc501b555ba0baaae4a0e84e86.png

这是表的索引页

568704c7f927083fb0e8770694f0dc10.png

表结构的sheet页

以后再让我导出数据库表结构我就能一下子导出了!需要这段代码的小伙伴可以私信我!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值