Mysql --- InnoAL SQL 助手

本项目基于MySQL 8.0 DBA运维核心能力,对接硅基流动开源大模型API,打造了面向电商订单库的智能查询与性能调优一体化系统。

系统支持直接输入业务自然语言,自动生成合规可执行的MySQL查询语句,运行后直接输出结构化结果表格;同时依托大模型能力完成订单数据的业务化解读,还能自动解析SQL执行计划,输出标准化索引优化方案,全程无需人工手写、调试SQL,也不用手动分析执行计划。

它的核心价值在于:

哪怕没有专业SQL开发能力的业务人员,也能自主完成业务数据查询,直接替代人工统计报表、手工分析SQL性能这类高重复的运维工作;深度打通MySQL专业运维能力与大模型自然语言理解能力,完美适配企业轻量化数据自助查询、SQL智能性能优化、数据结果AI解读的一站式落地场景。

关闭selinx和防火墙

通过vi /etc/selinux/config进去 将SELINUX设置为:SELINUX=disabled

重启:reboot 通过getenforce即可查看是否关闭成功

源码编译安装Python3.11.9

配置国内 pip 源及安装项目依赖

下载:https://www.python.org/downloads/release/python-3119/
部署并初始化MySQL 8.0.45
下载:https://downloads.mysql.com/archives/community/
创建数据库和表

在腾讯云官网获取API Key

新建目录及脚本

编写环境变量脚本

更改脚本权限

编写数据库连接脚本
python 复制代码
# -*- coding: utf-8 -*-
# 文件名:mysql_client.py
# 功能:MySQL8.0数据库统一封装类
# 作用:封装数据库连接、普通查询、EXPLAIN执行计划、SQL安全拦截,统一抛出友好异常,给上层业务调用
import pymysql
import os
import re
from dotenv import load_dotenv
 
# 加载项目根目录下.env文件的数据库配置
load_dotenv()
 
class Mysql80Client:
    # 数据库操作封装类,所有数据库相关操作统一在此管理
    def __init__(self):
        # 初始化时读取环境变量,参数缺失则设置兜底默认值,防止程序直接崩溃
        self.host = os.getenv("MYSQL_HOST", "127.0.0.1")
        self.port = int(os.getenv("MYSQL_PORT", "3306"))
        self.user = os.getenv("MYSQL_USER", "root")
        self.password = os.getenv("MYSQL_PASSWORD", "")
        self.database = os.getenv("MYSQL_DB", "testdb")
        # 数据库连接对象,初始为空
        self.conn = None
        # 实例创建后自动建立数据库连接
        self.connect()
 
    def connect(self):
        """创建数据库连接,捕获连接异常并抛出可读错误信息"""
        try:
            self.conn = pymysql.connect(
                host=self.host,
                port=self.port,
                user=self.user,
                password=self.password,
                database=self.database,
                charset='utf8mb4',  # 支持中文、emoji完整字符集
                cursorclass=pymysql.cursors.DictCursor  # 查询结果以字典返回,方便按字段取值
            )
        except pymysql.MySQLError as e:
            # MySQL专属连接错误,提示账号、地址、密码排查方向
            raise Exception(f"数据库连接失败,请检查地址/账号/密码:{e.args[1]}")
        except Exception as e:
            # 其余未知连接异常统一捕获
            raise Exception(f"数据库连接异常:{str(e)}")
 
    @staticmethod
    def _check_sql_safety(sql: str) -> None:
        """
        静态私有安全校验方法
        核心防护:拦截增删改、建表删表等危险操作,仅允许SELECT查询,防止AI生成危险SQL篡改数据
        """
        # 去除首尾空格并转为大写,统一匹配规则
        sql_trim = sql.strip().upper()
        # 危险操作关键字黑名单
        danger_keywords = ["INSERT", "UPDATE", "DELETE", "DROP", "ALTER", "CREATE", "TRUNCATE", "REPLACE"]
        for kw in danger_keywords:
            # 单词边界匹配,避免字段名包含关键字时误拦截
            if re.search(r'\b' + re.escape(kw) + r'\b', sql_trim):
                raise Exception(f"安全拦截:禁止执行 {kw} 类型语句,仅支持 SELECT 查询")
 
    def execute_query(self, sql: str):
        """
        执行普通SELECT查询
        :param sql: 待执行查询语句
        :return: (字段名列表, 全部数据行字典列表)
        """
        # 执行SQL前先做安全校验,拦截危险语句
        self._check_sql_safety(sql)
        try:
            # with自动管理游标,用完自动释放资源
            with self.conn.cursor() as cursor:
                cursor.execute(sql)
                # 提取查询结果表头字段
                columns = [desc[0] for desc in cursor.description]
                # 读取全部查询数据
                rows = cursor.fetchall()
                return columns, rows
        except pymysql.MySQLError as e:
            # 捕获SQL语法、表不存在等数据库执行错误
            raise Exception(f"SQL执行失败(错误码 {e.args[0]}):{e.args[1]}")
        except Exception as e:
            # 通用查询异常兜底
            raise Exception(f"查询异常:{str(e)}")
 
    def get_explain_plan(self, sql: str):
        """
        获取SQL执行计划EXPLAIN,用于性能调优分析
        :param sql: 待分析SELECT语句
        :return: (执行计划表头, 执行计划详情数据)
        """
        # 同样先校验SQL安全性
        self._check_sql_safety(sql)
        # 拼接EXPLAIN关键字,生成分析语句
        explain_sql = f"EXPLAIN {sql}"
        try:
            with self.conn.cursor() as cursor:
                cursor.execute(explain_sql)
                columns = [desc[0] for desc in cursor.description]
                rows = cursor.fetchall()
                return columns, rows
        except pymysql.MySQLError as e:
            raise Exception(f"获取执行计划失败:{e.args[1]}")
        except Exception as e:
            raise Exception(f"执行计划异常:{str(e)}")
 
    def close(self):
        """安全关闭数据库连接,释放资源,避免长时间占用连接池"""
        # 判断连接存在且未关闭才执行关闭操作
        if self.conn and not self.conn._closed:
            self.conn.close()

项目执行

web可视化版本

安装 Python 依赖

创建 Streamlit 可视化入口 web_main.py

创建 systemd 后台常驻服务

Windows网页访问测试

192.168.152.133

浏览器访问:192.168.152.133:8501

相关推荐
2501_933670792 小时前
2026秋招数据分析岗备考路线:SQL、BI、项目与面试题拆解
数据库
我要见SA姐15 小时前
告别 Copilot?Codex 本地化部署指南
运维·数据库·机器学习·oracle·回归
xcLeigh6 小时前
聊聊国产化替换:好用数据迁移工具KDMS怎么帮咱们搞定评估难
数据库·sql·数据迁移·kes·kdms
Elastic 中国社区官方博客6 小时前
列式存储并不等同于列式数据库。Columnar 模式为 Elasticsearch 带来了什么
大数据·运维·数据库·elasticsearch·搜索引擎
我要见SA姐16 小时前
用 Claude Code 重构遗留系统:从评估到落地的完整实践指南
数据库·ide·vscode·oracle·编辑器
Nturmoils8 小时前
一份 KDMS 评估报告,怎样排出迁移先后顺序
数据库
这个DBA有点耶8 小时前
异构数据集成怎么做?5 种同步方案对比 + 金融级 CDC 实战解析
数据库·oracle·架构
独泪了无痕8 小时前
SQL函数实战:GREATEST与LEAST的技巧
数据库·sql·mysql
麻辣布丁8 小时前
MySQL篇面试题模拟
mysql
码少女8 小时前
Linux--多路转接之select
java·服务器·数据库