MYSQL导出 word格式所有表结构

网上看到几个都是单表导出,而且还要手工输入表名,表注释,我优化了一下,可以批量导出所有表结构

安装2个依赖

pip install pymysql

pip install python-docx

# 导包
import pymysql
from docx import Document
from docx.enum.table import WD_CELL_VERTICAL_ALIGNMENT
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.oxml import parse_xml
from docx.shared import Pt, RGBColor
from docx.oxml.ns import qn, nsdecls
 
# 读取或者创建文件
document = Document()       # 新建文档

# 如下配置换成自己的数据库
host = "localhost"
db="test"
user="test"
password = "test123"
 
def load_data_from_mysql(table_name):
    conn = pymysql.connect(host=host,
                           port=3306,
                           user=user,
                           password=password,
                           db=db,
                           charset="utf8")
    cursor = conn.cursor()
    sql = "SELECT UPPER(COLUMN_NAME) 字段名, COLUMN_COMMENT 字段名称, DATA_TYPE 类型, " \
          "(CASE WHEN DATA_TYPE = 'float' OR DATA_TYPE = 'double' OR DATA_TYPE = 'TINYINT' OR DATA_TYPE = 'SMALLINT' OR DATA_TYPE = 'MEDIUMINT' " \
          "OR DATA_TYPE = 'INT' OR DATA_TYPE = 'INTEGER'  OR DATA_TYPE = 'decimal' OR DATA_TYPE = 'bigint' THEN NUMERIC_PRECISION " \
          "ELSE CHARACTER_MAXIMUM_LENGTH END )  长度,  " \
          "CASE  WHEN IS_NULLABLE = 'YES'  THEN '是' ELSE '否' END 空否, CASE WHEN column_key = 'PRI' THEN '是' ELSE '' END  主键,'' 说明 " \
          "FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema ='"+db+"' AND table_name  = '{}'".format(table_name)
    print('执行sql:',sql)
    cursor.execute(sql)
    result = cursor.fetchall()
    return result

def load_tables():
    sql = "select TABLE_NAME ,TABLE_COMMENT  from INFORMATION_SCHEMA.TABLES t where TABLE_SCHEMA = '"+db+"'"  
    conn = pymysql.connect(host=host,
                           port=3306,
                           user=user,
                           password=password ,
                           db=db,
                           charset="utf8")
    cursor = conn.cursor()  
    print('执行sql:',sql)
    cursor.execute(sql)
    result = cursor.fetchall()
    return result
 
'''
总的大标题部分
'''
# 第二种设置标题的方式,此方式还可以设置文本的字体、颜色、大小等属性
run = document.add_heading("", level=1).add_run("表结构")
# 设置西文字体
run.font.name = u'宋体'
# 设置中文字体
run._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')
# 设置字体颜色
run.font.color.rgb = RGBColor(0,0,0)  # 黑色
# 设置字体大小
run.font.size = Pt(30)
# 设置下划线
# run.font.underline = True
# 设置删除线
# run.font.strike = True
# 设置加粗
run.bold = True
# 设置斜体
# run.italic = True
 
# 设置正文全局字体
document.styles['Normal'].font.name = u'宋体'
document.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')

tuple0 = load_tables()

for item in tuple0:
    # 查询sql获得二维元组
    tuple1 = load_data_from_mysql(item[0])
    # 二维元组转化为二维列表 ,且将其他类型转化为字符串 且将None转化为 ''
    table_data_list = list(list([( '' if it is None else str(it)) for it in items]) for items in list(tuple1))
    # 写入小标题
    title = item[0] + '   ' + item[1];
    document.add_heading(title, level=3)
    # 表格标题
    table_name = ['字段名', '字段名称', '类型', '长度', '空否', '主键', '说明']
    # 创建表格行列
    table = document.add_table(rows=len(table_data_list)+1, cols=len(table_name),style='Table Grid')
    # 首行设置背景色
    rows = table.rows[0]
    for cell in rows.cells:
        shading_elm = parse_xml(r'<w:shd {} w:fill="D9D9D9"/>'.format(nsdecls('w')))
        cell._tc.get_or_add_tcPr().append(shading_elm)
    # 写入表格标题
    for i in range(len(table_name)):
        cell = table.cell(0, i)
        cell.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER  # 水平居中
        cell.paragraphs[0].add_run(table_name[i])
        cell.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER  # 垂直居中
 
    # 写入表格内容
    for i in range(len(table_data_list)):
        for j in range(len(table_name)):
            table.cell(i+1, j).text = table_data_list[i][j]
 
 
# 4
document.save("database.docx")
 
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值