尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

告别手写SQL!openEuler+MySQL8.0+大模型自研InnoAI SQL助手|NL2SQL自动查询+智能性能调优完整实战

告别手写SQL!openEuler+MySQL8.0+大模型自研InnoAI SQL助手|NL2SQL自动查询+智能性能调优完整实战 一、项目前言背景1.1 业务痛点日常企业数据场景存在两大核心痛点业务人员不会写SQL运营、产品想要统计订单数据必须依赖后端/DBA开发人员写查询沟通成本高、报表交付慢DBA重复低效工作海量慢SQL人工分析EXPLAIN执行计划、手动设计索引重复性运维工作占用大量精力传统NL2SQL工具安全性差很多开源工具未做SQL拦截存在删改表、篡改数据风险密钥硬编码极易泄露。1.2 项目核心价值本项目基于openEuler国产操作系统MySQL8.0腾讯云TokenHub大模型聚合平台打造轻量化一体化智能SQL工具自然语言一键生成只读SQL仅允许SELECT语句自动拦截INSERT/UPDATE/DELETE/ALTER等危险操作自动执行查询AI业务解读查询结果表格化输出大模型自动生成通俗易懂的业务总结替代人工报表全自动SQL性能调优解析EXPLAIN执行计划定位全表扫描、文件排序等瓶颈直接输出可执行索引创建SQL与优化后语句双端交互入口服务器终端交互式菜单 Streamlit可视化Web面板运维/业务人员按需使用完善安全机制敏感账号密钥独立.env配置文件文件权限设置600全程不打印明文密码。1.3 开发周期人员开发人数1~3人小组单人开发均可总周期3个工作日每日8小时Day1openEuler环境部署、MySQL8.0搭建、大模型API申请、运维知识点梳理Day2Python分层脚本开发、NL2SQL、SQL调优、终端主程序联调Day3多场景测试、提示词优化、权限安全加固、整体验收二、整体技术方案与四层架构2.1 软硬件环境清单硬件环境类别参数规格用途虚拟机/云ECSCPU≥2核内存≥4GB磁盘≥20GB运行openEuler、MySQL、Python程序软件环境软件版本作用操作系统openEuler/RHEL9底层运行系统国产适配MySQL8.0.45存储电商订单测试数据order_infoPython3.11.9源码编译项目开发主语言大模型平台腾讯云TokenHub兼容DeepSeek V4 Pro、Qwen3.5-PlusWeb框架Streamlit零前端可视化网页面板Python依赖pymysql、python-dotenv、langchain-openai、tabulate数据库连接、配置读取、大模型调用、表格渲染网络账号资源服务器外网可访问443端口用于调用大模型API腾讯云账号完成实名认证获取TokenHub API Key。2.2 四层分层架构详解层级1接入交互层双入口面向运维、业务、开发人员两种使用模式完全复用底层逻辑命令行终端python3 main.py交互式菜单适合服务器本地运维快速排查Web可视化页面Streamlitweb_main.py浏览器访问图形化输入、一键复制SQL、表格展示结果非技术人员友好。层级2Python程序核心层5个核心文件解耦设计main.py项目总调度入口封装NL2SQL查询、AI总结、SQL调优三大核心业务终端/Web共用底层函数mysql_client.py数据库统一封装类管理连接、安全校验、执行SQL、获取EXPLAIN执行计划prompts.py提示词工程统一管理内置NL2SQL、SQL调优两套Prompt附带正则提取纯净SQL工具web_main.pyStreamlit前端页面输入校验、页面美化、结果渲染.env独立配置文件存放数据库账号、大模型密钥敏感信息与代码隔离。层级3底层数据持久层openEuler虚拟机部署MySQL8.0.45创建testdb数据库、order_info电商订单表预置20条测试订单数据作为项目唯一数据源。层级4AI大模型服务层腾讯云TokenHub聚合平台作为统一AI网关一套代码无缝切换多款开源大模型统一鉴权、计费、运维兼容OpenAI标准接口。三、完整环境搭建实操openEuler3.1 openEuler系统初始化1关闭防火墙与SELinux# 关闭SELinux永久生效sed-i7s/enforcing/disabled//etc/selinux/config# 关闭并禁用防火墙systemctl disable--nowfirewalld systemctl status firewalld# 修改主机名hostnamectl set-hostname serverbash2时间同步安装系统依赖# 配置阿里云时间服务器vim/etc/chrony.conf server ntp.aliyun.com iburst systemctl restart chronyd chronyc sources# 安装编译全套依赖dnfinstall-ygcc gcc-cmakecmake zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel libffi-devel tk-develwgettarvimtree net-tools openssh-server3.2 源码编译安装Python3.11.9# 上传源码至/usr/local/srccd/usr/local/srctar-zxvfPython-3.11.9.tgzcdPython-3.11.9# 编译配置./configure--prefix/usr/local/python3.11 --enable-sharedmake-j$(nproc)makeinstall# 配置动态链接库echo/usr/local/python3.11/lib/etc/ld.so.conf.d/python311.conf ldconfig# 全局软链接不覆盖系统Pythonln-s/usr/local/python3.11/bin/python3.11 /usr/local/bin/python3ln-s/usr/local/python3.11/bin/pip3.11 /usr/local/bin/pip3bash# 验证安装python3-Vpip3-V# 校验SSL大模型接口必备python3-cimport ssl; print(ssl.OPENSSL_VERSION)配置阿里pip镜像源mkdir~/.pipvim~/.pip/pip.conf[global]index-urlhttp://mirrors.aliyun.com/pypi/simple/[install]trusted-hostmirrors.aliyun.com# 安装项目依赖pip3install--upgradepip pip3installpymysql python-dotenv tabulate langchain langchain-openai streamlit3.3 MySQL8.0.45部署初始化1解压安装并初始化# 上传MySQL压缩包移动至/usr/local/mysqltar-xvfmysql-8.0.45-linux-glibc2.28-x86_64.tar.xzmvmysql-8.0.45-linux-glibc2.28-x86_64 /usr/local/mysqlcd/usr/local/mysql# 创建mysql用户组与系统用户groupaddmysqluseradd-r-gmysql-s/sbin/nologin mysqlmkdirdatachmod-R750datachown-Rmysql:mysql /usr/local/mysql# 初始化数据库保存输出的初始密码bin/mysqld--initialize--usermysql--basedir/usr/local/mysql--datadir/usr/local/mysql/data# 后台启动bin/mysqld_safe--usermysql2修改root密码、配置systemd服务# 登录数据库修改密码bin/mysql-uroot-pmysqlalter userrootlocalhostidentified with mysql_native_password by123456;mysqlflush privileges;exit;# 编写my.cnf配置vim/etc/my.cnf[client]port3306socket/tmp/mysql.sock[mysqld]port3306basedir/usr/local/mysql datadir/usr/local/mysql/data tmpdir/tmp socket/tmp/mysql.sock character-set-serverutf8mb4 collation-serverutf8mb4_general_ci default-storage-engineINNODB log_errorerror.log# systemd服务文件vim/usr/lib/systemd/system/mysqld.service[Unit]DescriptionMySQL ServerAfternetwork.target remote-fs.target nss-lookup.target[Service]TypenotifyUsermysqlGroupmysqlExecStart/usr/local/mysql/bin/mysqld --defaults-file/etc/my.cnfLimitNOFILE65535LimitNPROC65535Restarton-failureRestartPreventExitStatus1TimeoutSec0[Install]WantedBymulti-user.target# 重载并开机自启systemctl daemon-reload systemctlenable--nowmysqld.service# 配置环境变量echoexport PATH$PATH:/usr/local/mysql/bin~/.bash_profilesource~/.bash_profile mysql-V3创建业务库与订单测试表createdatabasetestdb;usetestdb;createtableorder_info(idBIGINTAUTO_INCREMENTPRIMARYKEYCOMMENT订单ID,user_idINTCOMMENT用户ID,order_nameVARCHAR(200)COMMENT商品名称,pay_amountDECIMAL(10,2)COMMENT支付金额,create_timeDATETIMECOMMENT下单时间)ENGINEInnoDBCOMMENT电商订单业务表;-- 插入20条测试数据INSERTINTOorder_info(user_id,order_name,pay_amount,create_time)VALUES(1001,智能手机,2999.00,2026-05-01 10:20:00),(1001,有线入耳耳机,199.00,2026-05-02 14:10:00),(1002,14英寸轻薄笔记本电脑,5499.00,2026-05-03 09:30:00),(1002,无线蓝牙鼠标,89.00,2026-05-03 09:35:00),(1003,平板学习机,1799.00,2026-05-04 11:05:00),(1003,平板专用保护壳,49.00,2026-05-04 11:08:00),(1004,机械游戏键盘,349.00,2026-05-05 16:42:00),(1004,电竞头戴耳机,459.00,2026-05-05 16:48:00),(1005,大屏智能电视,3299.00,2026-05-06 08:15:00),(1005,电视壁挂支架,129.00,2026-05-06 08:20:00),(1006,无线快充充电器,129.00,2026-05-03 13:22:00),(1006,降噪蓝牙耳机,399.00,2026-05-03 13:25:00),(1007,电竞显示器,1899.00,2026-05-07 10:10:00),(1007,显示器增高支架,79.00,2026-05-07 10:15:00),(1008,折叠平板支架,39.00,2026-05-04 15:30:00),(1008,便携充电宝,159.00,2026-05-04 15:33:00),(1009,台式游戏主机,6999.00,2026-05-08 09:05:00),(1009,电竞防滑鼠标垫,59.00,2026-05-08 09:08:00),(1010,手机钢化膜,29.00,2026-05-05 17:12:00),(1010,桌面收纳支架,45.00,2026-05-05 17:16:00);3.4 腾讯云TokenHub大模型API配置访问腾讯云官网注册并实名认证进入TokenHub控制台 → API Key管理 → 创建密钥保存sk-xxx密钥模型推荐deepseek-v4-pro/Qwen3.5-Plus无多余思考链避免SQL解析报错。四、项目核心代码分层讲解4.1 项目目录创建mkdir-p/opt/mysql_ai_toolscd/opt/mysql_ai_toolstouchmain.py mysql_client.py prompts.py web_main.py .env4.2 .env 配置文件安全加固 chmod 600# MySQL数据库配置 MYSQL_HOST127.0.0.1 MYSQL_PORT3306 MYSQL_USERroot MYSQL_PASSWORD123456 MYSQL_DBtestdb # 腾讯云TokenHub大模型配置 LLM_API_KEYsk-jUJebmj56mEQhhBep04A3AIaVlVV2NA97F45iimZ*** LLM_BASE_URLhttps://tokenhub.tencentmaas.com/v1 LLM_MODEL_NAMEdeepseek-v4-pro LLM_TEMPERATURE0权限加固关键安全操作chmod600/opt/mysql_ai_tools/.env4.3 mysql_client.py 数据库封装SQL安全拦截核心亮点内置危险SQL黑名单仅放行SELECT查询防止数据误删改统一管理连接释放自动获取EXPLAIN执行计划。# -*- coding: utf-8 -*-importpymysqlimportosimportrefromdotenvimportload_dotenv load_dotenv()classMysql80Client:def__init__(self):self.hostos.getenv(MYSQL_HOST,127.0.0.1)self.portint(os.getenv(MYSQL_PORT,3306))self.useros.getenv(MYSQL_USER,root)self.passwordos.getenv(MYSQL_PASSWORD,)self.databaseos.getenv(MYSQL_DB,testdb)self.connNoneself.connect()defconnect(self):try:self.connpymysql.connect(hostself.host,portself.port,userself.user,passwordself.password,databaseself.database,charsetutf8mb4,cursorclasspymysql.cursors.DictCursor)exceptExceptionase:raiseException(f数据库连接失败:{str(e)})staticmethoddef_check_sql_safety(sql:str)-None:# 危险操作黑名单拦截增删改、DDL语句sql_trimsql.strip().upper()danger_keywords[INSERT,UPDATE,DELETE,DROP,ALTER,CREATE,TRUNCATE,REPLACE]forkwindanger_keywords:ifre.search(r\bre.escape(kw)r\b,sql_trim):raiseException(f安全拦截:禁止执行{kw}语句仅支持SELECT)defexecute_query(self,sql:str):self._check_sql_safety(sql)withself.conn.cursor()ascursor:cursor.execute(sql)columns[desc[0]fordescincursor.description]rowscursor.fetchall()returncolumns,rowsdefget_explain_plan(self,sql:str):self._check_sql_safety(sql)explain_sqlfEXPLAIN{sql}withself.conn.cursor()ascursor:cursor.execute(explain_sql)columns[desc[0]fordescincursor.description]rowscursor.fetchall()returncolumns,rowsdefclose(self):ifself.connandnotself.conn._closed:self.conn.close()4.4 prompts.py 提示词工程SQL提取工具统一管理两套Prompt严格约束大模型输出格式搭配正则三层匹配提取纯净SQL解决模型输出杂乱问题。# -*- coding: utf-8 -*-importreclassUnifiedPrompt:# 全局订单表结构统一维护一处TABLE_SCHEMA 表名: order_info (订单信息表) 字段说明: - id: 订单ID (主键,BIGINT) - user_id: 用户ID (INT) - order_name: 商品名称 (VARCHAR) - pay_amount: 支付金额 (DECIMAL(10,2)) - create_time: 下单时间 (DATETIME) # 自然语言转SQL提示词NL_TO_SQL_PROMPTf 你是严谨MySQL8.0工程师根据用户业务需求生成标准SELECT语句。 表结构{TABLE_SCHEMA}强制规则 1. 仅输出SELECT禁止任何增删改、建表语句 2. 只能使用给定字段禁止编造字段 3. SQL关键字大写中文别名无空格 4. SQL包裹在sql 代码块不输出多余解释文字 用户需求{{user_input}} # SQL性能调优提示词SQL_TUNE_PROMPTf 你是资深MySQL DBA根据SQLEXPLAIN执行计划输出优化方案。 表结构{TABLE_SCHEMA}待分析SQL{{sql_input}} 执行计划数据{{explain_data}} 输出要求 1. 点明核心性能问题全表扫描、文件排序、无索引等 2. 给出可直接执行的建索引SQL 3. 输出优化改写后的完整SQL 4. 分点简洁输出。 # 三层正则提取纯净SQLstaticmethoddefextract_sql(response_text:str)-str:ifnotresponse_text:return# 优先级1标准markdown sql代码块matchre.search(rsql\s*(.*?)\s*,response_text,re.DOTALL|re.IGNORECASE)ifmatch:returnmatch.group(1).strip()# 优先级2兜底匹配SELECT开头语句matchre.search(r(SELECT\s.*?;),response_text,re.DOTALL|re.IGNORECASE)ifmatch:returnmatch.group(1).strip()returnprompt_helperUnifiedPrompt()4.5 main.py 核心调度终端交互入口实现两大核心业务自然语言查询、SQL性能调优内置SQL清洗工具兼容各类模型输出格式终端菜单循环交互。完整代码见项目PDF文档核心逻辑nl2sql_query自然语言生成SQL、执行查询、AI业务总结sql_tune_analyze获取EXPLAIN、AI分析性能瓶颈、输出调优方案main_cli终端交互式菜单4.6 web_main.py Streamlit可视化网页核心能力左侧侧边栏导航切换「数据查询」「SQL调优」两大页面输入前置校验区分自然语言输入与SQL输入防止用户操作混淆美化页面CSS、表格、代码复制按钮、加载动画完全复用main.py底层业务函数无重复开发。4.7 Streamlit后台systemd常驻服务vim/etc/systemd/system/mysql-ai-web.service[Unit]DescriptionInnoAI SQL Streamlit Web服务Afternetwork.target mysqld.service[Service]TypesimpleUserrootWorkingDirectory/opt/mysql_ai_toolsExecStart/usr/local/python3.11/bin/python3-mstreamlit run web_main.py--server.address0.0.0.0--server.port8501--server.headlesstrueRestartalwaysRestartSec3StandardOutputjournalStandardErrorjournal[Install]WantedBymulti-user.target# 重载并开机自启systemctl daemon-reload systemctlenable--nowmysql-ai-web# 查看服务器IP浏览器访问 ip:8501hostname-I五、项目功能实测演示5.1 自然语言查询测试用例测试需求1001、1002、1003 每个用户的订单总消费金额与订单笔数按总消费从高到低排序1自动生成SQLSELECTuser_idAS用户ID,SUM(pay_amount)AS总消费金额,COUNT(id)AS订单笔数FROMorder_infoWHEREuser_idIN(1001,1002,1003)GROUPBYuser_idORDERBY总消费金额DESC2查询结果表格用户ID总消费金额订单笔数10025588.00210013198.00210031848.0023AI自动业务总结用户分层明显1002为高价值用户总消费5588元客单价远超其他两位用户三位用户订单笔数均为2单复购节奏高度相似样本数据订单数量统一建议扩大数据范围验证用户消费规律。5.2 SQL性能调优实测待优化SQLSELECTuser_idAS用户ID,SUM(pay_amount)AS总消费金额,COUNT(id)AS订单笔数FROMorder_infoWHEREuser_idIN(1001,1002,1003)GROUPBYuser_idORDERBY总消费金额DESC执行计划问题typeALL全表扫描、Using temporary; Using filesort临时表文件排序无任何索引命中。AI输出优化方案创建覆盖索引ALTERTABLEorder_infoADDINDEXidx_user_id_pay_amount(user_id,pay_amount);优化改写SQLSELECTuser_idAS用户ID,SUM(pay_amount)AS总消费金额,COUNT(*)AS订单笔数FROMorder_infoWHEREuser_idIN(1001,1002,1003)GROUPBYuser_idORDERBY总消费金额DESC;六、项目安全稳定性设计6.1 数据安全防护SQL黑白名单拦截仅放行SELECT自动拦截所有增删改、DDL危险语句配置文件权限隔离.env设置600权限仅root可读不打印账号密钥明文数据库使用只读逻辑无数据写入/修改操作避免业务数据损坏。6.2 程序稳定性保障全流程异常捕获数据库连接、大模型API、SQL语法错误统一捕获程序不崩溃输入容错空白输入、超长需求、无匹配数据友好提示SQL标准化清洗统一处理中文标点、全角空格、关键字粘连解决模型输出语法报错数据库连接自动关闭避免长连接占用资源。6.3 系统兼容性系统openEuler/RHEL国产Linux兼容数据库锁定MySQL8.0.45适配InnoDB索引规范大模型兼容所有OpenAI接口标准MaaS平台一键切换DeepSeek/Qwen系列模型。七、踩坑记录解决方案Python编译后SSL缺失编译时必须带上openssl-devel依赖否则大模型HTTPS接口调用失败大模型输出携带思考链SQL提取失败选用不带推理思考的模型增加正则过滤多余文本Streamlit外部无法访问启动参数添加--server.address 0.0.0.0开放局域网访问MySQL8.0认证插件报错修改root账号认证方式为mysql_native_password.env密钥泄露风险必须执行chmod 600禁止其他用户读取配置文件。八、项目拓展优化方向权限精细化增加Web页面登录鉴权区分普通查询用户与调优管理员多表关联支持扩展表结构支持多表JOIN场景NL2SQL生成慢SQL批量分析支持批量导入多条SQL批量输出索引优化方案Docker容器化打包openEuler、MySQL、Python环境一键部署本地私有大模型适配兼容本地部署Qwen/DeepSeek离线模型无需外网API导出报表查询结果支持Excel下载自动生成业务分析报告文件。九、项目总结落地价值轻量化一站式AI数据库工具零SQL基础业务人员可自主查询数据解放DBA重复调优工作适配中小企业轻量化数据平台技术学习点覆盖国产openEuler运维、MySQL8.0深度运维、Python分层架构、大模型Prompt工程、NL2SQL落地、Streamlit低代码Web开发、systemd服务部署适用人群计算机专业实训项目、运维工程师、后端开发、AI应用开发学习者完整实战案例部署门槛低配虚拟机即可运行3天完整从零搭建完成代码模块化易二次开发改造。
返回列表