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

相关推荐
znnnk8 小时前
数据库被AI“重写”:2026,从CPU中心走向GPU中心
数据库·人工智能·oracle
微微%8 小时前
mysql的安装和使用
数据库·mysql·mysql8安装
软件派10 小时前
MiniMax M3.1 Flash 高频业务落地实战指南
大数据·数据库·人工智能
云边云科技_云网融合10 小时前
连锁门店组网怎么做?SD-WAN 多分支组网的架构选型、部署与成本结构
服务器·数据库·php
泡海椒11 小时前
# 深度解析JQuick-SQL Join重排序与哈希连接执行机制
数据库·sql·哈希算法
acrel711 小时前
医院用电隐患治理与节能降耗及智慧能源平台应用
网络·数据库
snow@li12 小时前
PowerDesigner 全景教程:从业务建模、表结构设计、关系管理到正向/逆向、文档输出
数据库
ss27312 小时前
PostgreSQL表级锁、行级锁、轻量级锁
数据库·postgresql·区块链
RacentCLM12 小时前
证书即服务CaaS:从申请、续期到部署的自动化链路拆解
运维·数据库·自动化·ssl
SelectDB12 小时前
安全评审卡了三周,我把部署形态的四种选项重新排了一遍
大数据·数据库·云原生