导出数据库表结构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")

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

相关推荐
数据知道2 小时前
反序列化漏洞:Java、PHP、Python 三条线各讲透
java·网络·python·安全·网络安全·php
努力的小Qin3 小时前
梯度下降如何实现参数优化:从线性回归到 Sigmoid 分类
人工智能·python·神经网络
strength_zhou20133 小时前
Python检查MongoDB索引列中的字段是否存在
python·mongodb
zander2583 小时前
LeetCode 739:每日温度——为什么单调栈要持续弹出
开发语言·python·算法
for_ever_love__3 小时前
python基础语法学习: 文件操作
python·学习
青春不败 177-3266-05204 小时前
基于R、Python的Copula变量相关性分析及AI大模型应用
人工智能·python·r语言·贝叶斯·统计学·copula
汤姆yu4 小时前
基于python大数据的高校舆情监测系统的设计与实现
大数据·开发语言·python·分享·分析·舆情
Cory.眼4 小时前
Python爬虫实战:从入门到进阶
开发语言·爬虫·python
qq_422152575 小时前
Token到底是什么?Tokenizer分词机制与中文token开销入门科普
人工智能·python·深度学习
buyue__5 小时前
Python实现连接MySQL数据库并执行目录下的所有SQL文件,遇到错误时终止执行。
python·mysql