导出数据库表结构excel

python 复制代码
import pymysql
import openpyxl
import unicodedata
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side
from openpyxl.utils import get_column_letter

# ===================== 请您修改以下MySQL连接配置 =====================
MYSQL_CONFIG = {
    'host': '*',       # 数据库地址
    'port': 33061,              # 端口
    'user': 'root',            # 账号
    'password': '***H', # 密码(请替换为您的实际密码)
    'database': '*', # 要导出的数据库名(请替换)
    'charset': 'utf8mb4'
}
# ======================================================================

# 列宽自动计算函数(适配中文/英文)
def display_width(text):
    return sum(2 if unicodedata.east_asian_width(c) in ('F','W') else 1 for c in str(text or ''))

def auto_fit_columns(ws, min_w=8, max_w=50, padding=3):
    for col_cells in ws.columns:
        letter = col_cells[0].column_letter
        w = max((display_width(c.value) for c in col_cells
                 if not isinstance(c, openpyxl.cell.cell.MergedCell) and c.value is not None), default=0)
        ws.column_dimensions[letter].width = max(min_w, min(w * 1.1 + padding, max_w))

# 样式定义
# 表头样式
header_fill = PatternFill('solid', fgColor='0070C0')
header_font = Font(name='Arial', bold=True, color='FFFFFF', size=11)
center_align = Alignment(horizontal='center', vertical='center')
left_align = Alignment(horizontal='left', vertical='center')

# 数据行样式
thin_gray = Side(style='thin', color='D9D9D9')
h_border = Border(bottom=thin_gray)
ZEBRA_BLUE = 'EBF1F8'
WHITE = 'FFFFFF'

# 1. 连接MySQL数据库
conn = pymysql.connect(**MYSQL_CONFIG)
cursor = conn.cursor()

# 2. 获取数据库所有表名
cursor.execute("SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = %s", (MYSQL_CONFIG['database'],))
tables = [table[0] for table in cursor.fetchall()]

# 3. 创建Excel工作簿
wb = Workbook()
# 删除默认创建的Sheet
wb.remove(wb.active)

# 4. 定义表头(与您的示例完全一致)
headers = ['序号', '列名', '数据类型', '长度', '主键', '自增', '允许空', '默认值', '列说明']

# 5. 遍历每个表,创建Sheet并写入数据
for table_name in tables:
    # 创建Sheet,名称为表名
    ws = wb.create_sheet(title=table_name)
    
    # 写入表头
    for col_idx, header in enumerate(headers, 1):
        cell = ws.cell(row=1, column=col_idx, value=header)
        cell.font = header_font
        cell.fill = header_fill
        cell.alignment = center_align
        cell.border = h_border
    ws.row_dimensions[1].height = 25

    # 查询表结构信息
    sql = """
    SELECT 
        COLUMN_NAME, 
        DATA_TYPE, 
        CHARACTER_MAXIMUM_LENGTH, 
        COLUMN_KEY, 
        EXTRA, 
        IS_NULLABLE, 
        COLUMN_DEFAULT, 
        COLUMN_COMMENT 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_SCHEMA = %s AND TABLE_NAME = %s
    ORDER BY ORDINAL_POSITION
    """
    cursor.execute(sql, (MYSQL_CONFIG['database'], table_name))
    columns = cursor.fetchall()

    # 写入数据行
    for row_idx, col_info in enumerate(columns, 2):
        # 序号
        ws.cell(row=row_idx, column=1, value=row_idx-1).alignment = center_align
        # 列名
        ws.cell(row=row_idx, column=2, value=col_info[0]).alignment = left_align
        # 数据类型
        ws.cell(row=row_idx, column=3, value=col_info[1]).alignment = left_align
        # 长度
        ws.cell(row=row_idx, column=4, value=col_info[2] if col_info[2] else '').alignment = center_align
        # 主键
        is_primary = '是' if col_info[3] == 'PRI' else '否'
        ws.cell(row=row_idx, column=5, value=is_primary).alignment = center_align
        # 自增
        is_auto_increment = '是' if 'auto_increment' in col_info[4] else '否'
        ws.cell(row=row_idx, column=6, value=is_auto_increment).alignment = center_align
        # 允许空
        is_nullable = '是' if col_info[5] == 'YES' else '否'
        ws.cell(row=row_idx, column=7, value=is_nullable).alignment = center_align
        # 默认值
        ws.cell(row=row_idx, column=8, value=col_info[6] if col_info[6] else '').alignment = left_align
        # 列说明
        ws.cell(row=row_idx, column=9, value=col_info[7] if col_info[7] else '').alignment = left_align

        # 交替背景色
        bg = ZEBRA_BLUE if (row_idx-2) % 2 == 0 else WHITE
        fill = PatternFill('solid', fgColor=bg)
        for col in range(1, 10):
            ws.cell(row=row_idx, column=col).fill = fill
            ws.cell(row=row_idx, column=col).border = h_border

    # 自动调整列宽
    auto_fit_columns(ws)
    # 冻结表头
    ws.freeze_panes = 'A2'

# 6. 保存Excel文件
output_file = f"{MYSQL_CONFIG['database']}_表结构导出.xlsx"
wb.save(output_file)

# 7. 关闭连接
cursor.close()
conn.close()

print(f"导出完成!文件已保存为:{output_file}")
print(f"共导出 {len(tables)} 个表,每个表对应一个独立Sheet")

将数据库按照这种格式导出来

相关推荐
CCIE-Yasuo28 分钟前
网络安全-学习数据库-Mysql-2
数据库·学习·mysql
zh路西法36 分钟前
【PACE】面向永磁同步电机PMSM 执行器的参数辨识与能耗感知强化学习 Sim-to-Real
python·cma-es·pmsm·sim-to-real·issac·pace
后台模板学习1 小时前
大模型 Prompt 工程在电商订单系统中的踩坑记录
java·python·prompt
2601_967987371 小时前
如何运行 Python 代码
python·最佳实践·脚本文件·代码运行·交互式环境
WiKiLeaks_successor1 小时前
重构Time库的抽象设计
python·重构
AI源码2 小时前
基于 Python 的短视频用户行为分析系统
开发语言·python
第九序言T2 小时前
数据分析岗 Pandas 面试题 20 道(上):概念与读代码
python·数据分析·pandas·数据处理
Dmz丶2 小时前
前端转 AI 100 天 Day 37:Few-shot 与 CoT——让模型学会“推理”
python
这个DBA有点耶2 小时前
云数据库半夜卡顿,CPU才30%?深挖云盘IOPS突发限制与内核挂起机制
数据库·mysql·云原生
孟健2 小时前
我用Grok Bot本地剪口播视频,3段提示词搞定气口切除、字幕与封面
人工智能·python·aigc