【实战】Python 一键生成数据库说明文档(对接阿里云百炼 AI,输出 Word 格式)

在日常开发中,数据库说明文档是项目交付、团队协作的核心文档之一,但手动编写不仅耗时,还容易遗漏字段注释、表关系等关键信息。本文将分享一套基于 Python + 阿里云百炼 AI的自动化方案:自动读取 MySQL 表结构,调用 AI 生成业务化说明,最终输出规范的 Word 格式数据库文档,彻底告别手动编写!

一、核心功能

  1. 自动连接 MySQL 数据库,批量读取所有表 / 字段元数据(字段名、类型、注释、主键等);
  2. 对接阿里云百炼(通义千问)AI,智能生成表的业务含义说明;
  3. 自动输出带格式、带表格的 Word(.docx)文档,无需手动排版;
  4. 兼容 MySQL 8.0 + 版本,解决认证 / 连接兼容性问题。

二、环境准备

1. 安装依赖库

bash

运行

复制代码
# 数据库连接
pip install pymysql
# AI接口调用
pip install requests
# Word文档生成
pip install python-docx
# 环境变量管理(可选)
pip install python-dotenv

2. 阿里云百炼 API 准备

  • 访问阿里云百炼控制台,登录后在「API-KEY 管理」中创建并复制 API Key;
  • 确保 API Key 有足够的调用额度(免费额度足够测试使用)。

3. MySQL 环境确认

  • 确认 MySQL 服务已启动,端口 / 账号 / 密码可正常访问;

三、完整实现代码

1. 核心代码(直接复用)

python

运行

复制代码
import os
import pymysql
import requests
import json
from dotenv import load_dotenv
from docx import Document
from docx.shared import Inches
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.oxml.ns import qn

# 加载环境变量
load_dotenv()

# ===================== 配置项(改这里) =====================
CONFIG = {
    "db": {
        "host": "127.0.0.1",  # 本地库优先填127.0.0.1,避免localhost解析问题
        "port": 3306,
        "user": "root",       # 你的MySQL用户名
        "password": "你的MySQL密码", # 你的MySQL密码
        "database": "你的数据库名",   # 要生成文档的数据库名
        "charset": "utf8mb4"
    },
    "ali": {
        "api_key": "你的阿里云百炼API Key",
        "model": "qwen-turbo"
    },
    "docs": {
        "output_file": "数据库说明文档.docx"  # 输出doc格式(docx兼容所有Word版本)
    }
}
# ==================================================================

class AliDBDocGenerator:
    def __init__(self, config):
        self.config = config
        self.db_conn = None
        self.cursor = None
        # 初始化Word文档
        self.doc = Document()
        # 设置Word全局字体(解决中文乱码)
        self._set_doc_font()

    def _set_doc_font(self):
        """设置Word文档字体,避免中文乱码"""
        style = self.doc.styles['Normal']
        style.font.name = '微软雅黑'
        style._element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑')

    def connect(self):
        self.db_conn = pymysql.connect(**self.config["db"])
        self.cursor = self.db_conn.cursor()
        print("✅ 数据库连接成功")

    def get_tables(self):
        """获取数据库所有表名"""
        self.cursor.execute("SHOW TABLES")
        return [t[0] for t in self.cursor.fetchall()]

    def get_table_info(self, table):
        """获取单表完整结构"""
        # 查询字段信息
        sql = """
        SELECT 
            COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT, COLUMN_COMMENT, COLUMN_KEY
        FROM INFORMATION_SCHEMA.COLUMNS 
        WHERE TABLE_SCHEMA = %s AND TABLE_NAME = %s
        """
        self.cursor.execute(sql, (self.config["db"]["database"], table))
        rows = self.cursor.fetchall()

        fields = []
        for r in rows:
            fields.append({
                "字段名": r[0],
                "类型": r[1],
                "可为空": "是" if r[2] == "YES" else "否",
                "默认值": r[3] if r[3] else "无",
                "注释": r[4] if r[4] else "无",
                "键": "主键" if r[5] == "PRI" else "无"
            })

        # 查询表注释
        self.cursor.execute("""
            SELECT TABLE_COMMENT 
            FROM INFORMATION_SCHEMA.TABLES 
            WHERE TABLE_SCHEMA = %s AND TABLE_NAME = %s
        """, (self.config["db"]["database"], table))
        comment = self.cursor.fetchone()[0] or "无"

        return {
            "表名": table,
            "表注释": comment,
            "字段": fields
        }

    def call_ali_ai(self, table_info):
        """调用阿里云百炼AI生成表说明"""
        url = "https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation"
        headers = {
            "Authorization": f"Bearer {self.config['ali']['api_key']}",
            "Content-Type": "application/json"
        }

        # 优化Prompt,让AI输出结构化内容(适配Word排版)
        prompt = f"""
你是专业DBA,请根据以下数据库表结构,生成清晰的表说明(纯文本,不要markdown格式):
1. 第一行输出「表名:XXX(表注释)」
2. 第二行输出「业务含义:XXX」
3. 第三行开始输出字段说明(每行格式:字段名-类型-可为空-默认值-键-注释)

表结构:
{json.dumps(table_info, ensure_ascii=False, indent=2)}
"""

        data = {
            "model": self.config["ali"]["model"],
            "input": {"prompt": prompt}
        }

        try:
            resp = requests.post(url, json=data, headers=headers, timeout=30)
            result = resp.json()
            return result["output"]["text"].strip()
        except Exception as e:
            return f"表名:{table_info['表名']}\n业务含义:生成失败\n错误:{str(e)}"

    def add_table_to_doc(self, table_info, ai_desc):
        """将单表信息添加到Word文档"""
        # 1. 添加表标题
        title = self.doc.add_heading(level=1)
        title_run = title.add_run(f"{table_info['表名']} - {table_info['表注释']}")
        title_run.font.size = Inches(0.2)
        title.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT

        # 2. 添加AI生成的业务说明
        desc_para = self.doc.add_paragraph()
        desc_para.add_run("业务含义:").bold = True
        desc_para.add_run(ai_desc.split("业务含义:")[-1].split("\n")[0].strip())

        # 3. 创建字段表格(6列:字段名/类型/可为空/默认值/键/注释)
        fields = table_info["字段"]
        table = self.doc.add_table(rows=1, cols=6)
        table.style = 'Table Grid'  # 带边框的表格

        # 设置表头
        hdr_cells = table.rows[0].cells
        hdr_texts = ["字段名", "数据类型", "是否可为空", "默认值", "键类型", "字段注释"]
        for i, text in enumerate(hdr_texts):
            hdr_cells[i].text = text
            # 表头加粗
            for paragraph in hdr_cells[i].paragraphs:
                for run in paragraph.runs:
                    run.bold = True

        # 填充字段数据
        for field in fields:
            row_cells = table.add_row().cells
            row_cells[0].text = field["字段名"]
            row_cells[1].text = field["类型"]
            row_cells[2].text = field["可为空"]
            row_cells[3].text = field["默认值"]
            row_cells[4].text = field["键"]
            row_cells[5].text = field["注释"]

        # 4. 添加分隔线(分页符)
        self.doc.add_page_break()

    def generate(self):
        """主生成逻辑"""
        # 1. 连接数据库
        self.connect()
        # 2. 添加文档标题
        main_title = self.doc.add_heading(level=0)
        main_title_run = main_title.add_run(f"{self.config['db']['database']} 数据库说明文档")
        main_title_run.font.size = Inches(0.3)
        main_title.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER

        # 3. 获取所有表并逐个生成
        tables = self.get_tables()
        for idx, table in enumerate(tables):
            print(f"📌 正在生成第{idx+1}/{len(tables)}个表:{table}")
            table_info = self.get_table_info(table)
            ai_desc = self.call_ali_ai(table_info)
            self.add_table_to_doc(table_info, ai_desc)

        # 4. 保存Word文档
        self.doc.save(self.config["docs"]["output_file"])
        print(f"\n✅ Word文档生成完成!路径:{os.path.abspath(self.config['docs']['output_file'])}")

        # 5. 关闭数据库连接
        self.cursor.close()
        self.db_conn.close()

if __name__ == "__main__":
    # 初始化并执行生成
    gen = AliDBDocGenerator(CONFIG)
    gen.generate()

四、使用步骤

1. 配置修改

修改代码中CONFIG字典的 3 部分内容:

  • db:填写 MySQL 的地址、账号、密码、数据库名;
  • ali:填写阿里云百炼的 API Key;
  • docs:指定 Word 文档输出路径。
相关推荐
**蓝桉**2 小时前
云网络概述
阿里云·云计算
2301_813599553 小时前
Go语言怎么做秒杀系统_Go语言秒杀系统实战教程【实用】
jvm·数据库·python
--fancy7 小时前
股票预测情感分析研究案例分析
python
shughui8 小时前
PyCharm 完整教程(旧版本卸载+旧/新版本下载安装+基础使用,2026最新版附安装包)
ide·python·pycharm
NCIN EXPE8 小时前
redis 使用
数据库·redis·缓存
Ztopcloud极拓云视角8 小时前
从 OpenRouter 数据看中美 AI 调用量反转:统计口径、模型路由与多云应对方案
人工智能·阿里云·大模型·token·中美ai
MongoDB 数据平台8 小时前
为编码代理引入 MongoDB 代理技能和插件
数据库·mongodb
极客on之路8 小时前
mysql explain type 各个字段解释
数据库·mysql
代码雕刻家8 小时前
MySQL与SQL Server的基本指令
数据库·mysql·sqlserver