項目經理讓我導出數據庫表結構!我怒懟他:以後這活你自己幹

我們項目組是老系統快10年了!隨著業務的增長,已經不能滿足業務的發展了!另外一個組要重新架構和開發我們的系統,但是數據庫要參照我們的進行設計。讓我導出數據表結構,好幾百個表讓我搞,我也不知道怎麼弄啊!正好我的本地裝有python 環境一氣之下用半個小時 寫了段代碼,然後怒懟他以後你這活自己幹行不行!別煩我!

既然寫了就發出來給大家看一下!python 實現的 數據庫 db2 !

下面看看一下怎麼實現的:

依賴兩個庫:ibm_db、openpyxl、

我們的數據庫是db2 的這個包不太好找 !家裡電腦上沒有安裝這兩個庫所以 圖片上報錯!

直接上代碼:圖片和代碼都有如下

項目經理讓我導出數據庫表結構!我怒懟他:以後這活你自己幹

項目經理讓我導出數據庫表結構!我怒懟他:以後這活你自己幹

項目經理讓我導出數據庫表結構!我怒懟他:以後這活你自己幹

項目經理讓我導出數據庫表結構!我怒懟他:以後這活你自己幹

<code># coding: utf-8
import ibm_db
import openpyxl
from 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 = None
try:
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:導出表結構結束------')

/<code>

下面看一下運行情況:執行 python db2conn.py

項目經理讓我導出數據庫表結構!我怒懟他:以後這活你自己幹

開始執行:python db2conn.py

項目經理讓我導出數據庫表結構!我怒懟他:以後這活你自己幹

導出完成了!

我們在看一下導出數據:

項目經理讓我導出數據庫表結構!我怒懟他:以後這活你自己幹

這是表的索引頁

項目經理讓我導出數據庫表結構!我怒懟他:以後這活你自己幹

表結構的sheet頁

以後再讓我導出數據庫表結構我就能一下子導出了!需要這段代碼的小夥伴可以私信我!


分享到:


相關文章: