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

相关推荐
Goodbye2 小时前
给 AI 装上记忆:基于 Milvus 向量数据库与 RAG 的智能日记系统实战
数据库
九皇叔叔2 小时前
RHEL 9.8 安装 Redis 8.8.1
数据库·redis·bootstrap
Python私教2 小时前
如意 Django CRM 容器化实战:后端、前端、数据库、Redis 的协同启动逻辑
前端·数据库·django
小张同学a.2 小时前
zabbix企业级监控平台3——服务监控与API实战
linux·运维·mysql·nginx·tomcat·zabbix
九皇叔叔2 小时前
RHEL9 安装 MySQL 8.4.11.LTS 版本
android·mysql·adb
海兰2 小时前
【数据库】tdsql(MySQL )的事务隔离级别
android·数据库·mysql
小蒜学长2 小时前
“守望自然”招募志愿者环保行动网站的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端
灵析表格3 小时前
Excel连接MySQL的函数化革命:灵析表格MySQL函数族业务应用分析
数据库·mysql·adb·excel·wps·灵析表格·excel公式盒子
todoitbo3 小时前
把发票台账接进 Codex:KingbaseES MCP 的一次只读风险排查实践
数据库·oracle·codex·kingbasees·mcp
Navicat中国3 小时前
使用 Navicat 轻松生成数据库测试数据
数据库·数据