news 2026/8/9 4:30:53

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

作者头像

张小明

前端开发工程师

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

一、项目前言&背景

1.1 业务痛点

日常企业数据场景存在两大核心痛点:

  1. 业务人员不会写SQL:运营、产品想要统计订单数据,必须依赖后端/DBA开发人员写查询,沟通成本高、报表交付慢;
  2. DBA重复低效工作:海量慢SQL人工分析EXPLAIN执行计划、手动设计索引,重复性运维工作占用大量精力;
  3. 传统NL2SQL工具安全性差:很多开源工具未做SQL拦截,存在删改表、篡改数据风险,密钥硬编码极易泄露。

1.2 项目核心价值

本项目基于openEuler国产操作系统+MySQL8.0+腾讯云TokenHub大模型聚合平台,打造轻量化一体化智能SQL工具:

  1. 自然语言一键生成只读SQL:仅允许SELECT语句,自动拦截INSERT/UPDATE/DELETE/ALTER等危险操作;
  2. 自动执行查询+AI业务解读:查询结果表格化输出,大模型自动生成通俗易懂的业务总结,替代人工报表;
  3. 全自动SQL性能调优:解析EXPLAIN执行计划,定位全表扫描、文件排序等瓶颈,直接输出可执行索引创建SQL与优化后语句;
  4. 双端交互入口:服务器终端交互式菜单 + Streamlit可视化Web面板,运维/业务人员按需使用;
  5. 完善安全机制:敏感账号密钥独立.env配置文件,文件权限设置600,全程不打印明文密码。

1.3 开发周期&人员

  • 开发人数:1~3人小组单人开发均可
  • 总周期:3个工作日(每日8小时)
    • Day1:openEuler环境部署、MySQL8.0搭建、大模型API申请、运维知识点梳理
    • Day2:Python分层脚本开发、NL2SQL、SQL调优、终端主程序联调
    • Day3:多场景测试、提示词优化、权限安全加固、整体验收

二、整体技术方案与四层架构

2.1 软硬件环境清单

硬件环境
类别参数规格用途
虚拟机/云ECSCPU≥2核,内存≥4GB,磁盘≥20GB运行openEuler、MySQL、Python程序
软件环境
软件版本作用
操作系统openEuler/RHEL9底层运行系统,国产适配
MySQL8.0.45存储电商订单测试数据order_info
Python3.11.9(源码编译)项目开发主语言
大模型平台腾讯云TokenHub兼容DeepSeek V4 Pro、Qwen3.5-Plus
Web框架Streamlit零前端可视化网页面板
Python依赖pymysql、python-dotenv、langchain-openai、tabulate数据库连接、配置读取、大模型调用、表格渲染
网络&账号资源
  1. 服务器外网可访问443端口,用于调用大模型API;
  2. 腾讯云账号完成实名认证,获取TokenHub API Key。

2.2 四层分层架构详解

层级1:接入交互层(双入口)

面向运维、业务、开发人员,两种使用模式完全复用底层逻辑:

  1. 命令行终端python3 main.py交互式菜单,适合服务器本地运维快速排查;
  2. Web可视化页面:Streamlitweb_main.py,浏览器访问,图形化输入、一键复制SQL、表格展示结果,非技术人员友好。
层级2:Python程序核心层(5个核心文件,解耦设计)
  1. main.py:项目总调度入口,封装NL2SQL查询、AI总结、SQL调优三大核心业务,终端/Web共用底层函数;
  2. mysql_client.py:数据库统一封装类,管理连接、安全校验、执行SQL、获取EXPLAIN执行计划;
  3. prompts.py:提示词工程统一管理,内置NL2SQL、SQL调优两套Prompt,附带正则提取纯净SQL工具;
  4. web_main.py:Streamlit前端页面,输入校验、页面美化、结果渲染;
  5. .env:独立配置文件,存放数据库账号、大模型密钥,敏感信息与代码隔离。
层级3:底层数据持久层

openEuler虚拟机部署MySQL8.0.45,创建testdb数据库、order_info电商订单表,预置20条测试订单数据,作为项目唯一数据源。

层级4:AI大模型服务层

腾讯云TokenHub聚合平台作为统一AI网关,一套代码无缝切换多款开源大模型,统一鉴权、计费、运维,兼容OpenAI标准接口。

三、完整环境搭建实操(openEuler)

3.1 openEuler系统初始化

1)关闭防火墙与SELinux
# 关闭SELinux永久生效sed-i'7s/enforcing/disabled/'/etc/selinux/config# 关闭并禁用防火墙systemctl disable--nowfirewalld systemctl status firewalld# 修改主机名hostnamectl set-hostname serverbash
2)时间同步+安装系统依赖
# 配置阿里云时间服务器vim/etc/chrony.conf server ntp.aliyun.com iburst systemctl restart chronyd chronyc sources# 安装编译全套依赖dnfinstall-ygcc gcc-c++makecmake zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel libffi-devel tk-develwgettarvimtree net-tools openssh-server

3.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-c"import ssl; print(ssl.OPENSSL_VERSION)"
配置阿里pip镜像源
mkdir~/.pipvim~/.pip/pip.conf[global]index-url=http://mirrors.aliyun.com/pypi/simple/[install]trusted-host=mirrors.aliyun.com# 安装项目依赖pip3install--upgradepip pip3installpymysql python-dotenv tabulate langchain langchain-openai streamlit

3.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--user=mysql--basedir=/usr/local/mysql--datadir=/usr/local/mysql/data# 后台启动bin/mysqld_safe--user=mysql&
2)修改root密码、配置systemd服务
# 登录数据库修改密码bin/mysql-uroot-pmysql>alter user'root'@'localhost'identified with mysql_native_password by'123456';mysql>flush privileges;exit;# 编写my.cnf配置vim/etc/my.cnf[client]port=3306socket=/tmp/mysql.sock[mysqld]port=3306basedir=/usr/local/mysql datadir=/usr/local/mysql/data tmpdir=/tmp socket=/tmp/mysql.sock character-set-server=utf8mb4 collation-server=utf8mb4_general_ci default-storage-engine=INNODB log_error=error.log# systemd服务文件vim/usr/lib/systemd/system/mysqld.service[Unit]Description=MySQL ServerAfter=network.target remote-fs.target nss-lookup.target[Service]Type=notifyUser=mysqlGroup=mysqlExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnfLimitNOFILE=65535LimitNPROC=65535Restart=on-failureRestartPreventExitStatus=1TimeoutSec=0[Install]WantedBy=multi-user.target# 重载并开机自启systemctl daemon-reload systemctlenable--nowmysqld.service# 配置环境变量echo"export PATH=$PATH:/usr/local/mysql/bin">>~/.bash_profilesource~/.bash_profile mysql-V
3)创建业务库与订单测试表
createdatabasetestdb;usetestdb;createtableorder_info(idBIGINTAUTO_INCREMENTPRIMARYKEYCOMMENT'订单ID',user_idINTCOMMENT'用户ID',order_nameVARCHAR(200)COMMENT'商品名称',pay_amountDECIMAL(10,2)COMMENT'支付金额',create_timeDATETIMECOMMENT'下单时间')ENGINE=InnoDBCOMMENT='电商订单业务表';-- 插入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配置


  1. 访问腾讯云官网,注册并实名认证;
  2. 进入TokenHub控制台 → API Key管理 → 创建密钥,保存sk-xxx密钥;
  3. 模型推荐: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 .env

4.2 .env 配置文件(安全加固 chmod 600)

# MySQL数据库配置 MYSQL_HOST=127.0.0.1 MYSQL_PORT=3306 MYSQL_USER=root MYSQL_PASSWORD=123456 MYSQL_DB=testdb # 腾讯云TokenHub大模型配置 LLM_API_KEY=sk-jUJebmj56mEQhhBep04A3AIaVlVV2NA97F45iimZ*** LLM_BASE_URL=https://tokenhub.tencentmaas.com/v1 LLM_MODEL_NAME=deepseek-v4-pro LLM_TEMPERATURE=0
权限加固(关键安全操作)
chmod600/opt/mysql_ai_tools/.env

4.3 mysql_client.py 数据库封装&SQL安全拦截

核心亮点:内置危险SQL黑名单,仅放行SELECT查询,防止数据误删改;统一管理连接释放,自动获取EXPLAIN执行计划。

# -*- coding: utf-8 -*-importpymysqlimportosimportrefromdotenvimportload_dotenv load_dotenv()classMysql80Client: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=Noneself.connect()defconnect(self):try:self.conn=pymysql.connect(host=self.host,port=self.port,user=self.user,password=self.password,database=self.database,charset='utf8mb4',cursorclass=pymysql.cursors.DictCursor)exceptExceptionase:raiseException(f"数据库连接失败:{str(e)}")@staticmethoddef_check_sql_safety(sql:str)->None:# 危险操作黑名单,拦截增删改、DDL语句sql_trim=sql.strip().upper()danger_keywords=["INSERT","UPDATE","DELETE","DROP","ALTER","CREATE","TRUNCATE","REPLACE"]forkwindanger_keywords:ifre.search(r'\b'+re.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]rows=cursor.fetchall()returncolumns,rowsdefget_explain_plan(self,sql:str):self._check_sql_safety(sql)explain_sql=f"EXPLAIN{sql}"withself.conn.cursor()ascursor:cursor.execute(explain_sql)columns=[desc[0]fordescincursor.description]rows=cursor.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_PROMPT=f""" 你是严谨MySQL8.0工程师,根据用户业务需求生成标准SELECT语句。 表结构:{TABLE_SCHEMA}强制规则: 1. 仅输出SELECT,禁止任何增删改、建表语句; 2. 只能使用给定字段,禁止编造字段; 3. SQL关键字大写,中文别名无空格; 4. SQL包裹在```sql ```代码块,不输出多余解释文字; 用户需求:{{user_input}} """# SQL性能调优提示词SQL_TUNE_PROMPT=f""" 你是资深MySQL DBA,根据SQL+EXPLAIN执行计划输出优化方案。 表结构:{TABLE_SCHEMA}待分析SQL:{{sql_input}} 执行计划数据:{{explain_data}} 输出要求: 1. 点明核心性能问题(全表扫描、文件排序、无索引等); 2. 给出可直接执行的建索引SQL; 3. 输出优化改写后的完整SQL; 4. 分点简洁输出。 """# 三层正则提取纯净SQL@staticmethoddefextract_sql(response_text:str)->str:ifnotresponse_text:return""# 优先级1:标准markdown sql代码块match=re.search(r"```sql\s*(.*?)\s*```",response_text,re.DOTALL|re.IGNORECASE)ifmatch:returnmatch.group(1).strip()# 优先级2:兜底匹配SELECT开头语句match=re.search(r"(SELECT\s+.*?;)",response_text,re.DOTALL|re.IGNORECASE)ifmatch:returnmatch.group(1).strip()return""prompt_helper=UnifiedPrompt()

4.5 main.py 核心调度+终端交互入口

实现两大核心业务:自然语言查询、SQL性能调优;内置SQL清洗工具,兼容各类模型输出格式,终端菜单循环交互。

完整代码见项目PDF文档,核心逻辑:

  1. nl2sql_query:自然语言生成SQL、执行查询、AI业务总结
  2. sql_tune_analyze:获取EXPLAIN、AI分析性能瓶颈、输出调优方案
  3. main_cli:终端交互式菜单

4.6 web_main.py Streamlit可视化网页

核心能力
  1. 左侧侧边栏导航,切换「数据查询」「SQL调优」两大页面;
  2. 输入前置校验:区分自然语言输入与SQL输入,防止用户操作混淆;
  3. 美化页面CSS、表格、代码复制按钮、加载动画;
  4. 完全复用main.py底层业务函数,无重复开发。

4.7 Streamlit后台systemd常驻服务

vim/etc/systemd/system/mysql-ai-web.service[Unit]Description=InnoAI SQL Streamlit Web服务After=network.target mysqld.service[Service]Type=simpleUser=rootWorkingDirectory=/opt/mysql_ai_toolsExecStart=/usr/local/python3.11/bin/python3-mstreamlit run web_main.py--server.address0.0.0.0--server.port8501--server.headlesstrueRestart=alwaysRestartSec=3StandardOutput=journalStandardError=journal[Install]WantedBy=multi-user.target# 重载并开机自启systemctl daemon-reload systemctlenable--nowmysql-ai-web# 查看服务器IP,浏览器访问 ip:8501hostname-I

五、项目功能实测演示

5.1 自然语言查询测试用例

测试需求:1001、1002、1003 每个用户的订单总消费金额与订单笔数,按总消费从高到低排序

1)自动生成SQL
SELECTuser_idAS用户ID,SUM(pay_amount)AS总消费金额,COUNT(id)AS订单笔数FROMorder_infoWHEREuser_idIN(1001,1002,1003)GROUPBYuser_idORDERBY总消费金额DESC
2)查询结果表格
用户ID总消费金额订单笔数
10025588.002
10013198.002
10031848.002
3)AI自动业务总结
  1. 用户分层明显:1002为高价值用户,总消费5588元,客单价远超其他两位用户;
  2. 三位用户订单笔数均为2单,复购节奏高度相似;
  3. 样本数据订单数量统一,建议扩大数据范围验证用户消费规律。

5.2 SQL性能调优实测

待优化SQL
SELECTuser_idAS用户ID,SUM(pay_amount)AS总消费金额,COUNT(id)AS订单笔数FROMorder_infoWHEREuser_idIN(1001,1002,1003)GROUPBYuser_idORDERBY总消费金额DESC
执行计划问题

type=ALL全表扫描、Using temporary; Using filesort临时表+文件排序,无任何索引命中。

AI输出优化方案
  1. 创建覆盖索引
ALTERTABLEorder_infoADDINDEXidx_user_id_pay_amount(user_id,pay_amount);
  1. 优化改写SQL
SELECTuser_idAS用户ID,SUM(pay_amount)AS总消费金额,COUNT(*)AS订单笔数FROMorder_infoWHEREuser_idIN(1001,1002,1003)GROUPBYuser_idORDERBY总消费金额DESC;

六、项目安全&稳定性设计

6.1 数据安全防护

  1. SQL黑白名单拦截:仅放行SELECT,自动拦截所有增删改、DDL危险语句;
  2. 配置文件权限隔离.env设置600权限,仅root可读,不打印账号密钥明文;
  3. 数据库使用只读逻辑,无数据写入/修改操作,避免业务数据损坏。

6.2 程序稳定性保障

  1. 全流程异常捕获:数据库连接、大模型API、SQL语法错误统一捕获,程序不崩溃;
  2. 输入容错:空白输入、超长需求、无匹配数据友好提示;
  3. SQL标准化清洗:统一处理中文标点、全角空格、关键字粘连,解决模型输出语法报错;
  4. 数据库连接自动关闭,避免长连接占用资源。

6.3 系统兼容性

  1. 系统:openEuler/RHEL国产Linux兼容;
  2. 数据库:锁定MySQL8.0.45,适配InnoDB索引规范;
  3. 大模型:兼容所有OpenAI接口标准MaaS平台,一键切换DeepSeek/Qwen系列模型。

七、踩坑记录&解决方案

  1. Python编译后SSL缺失:编译时必须带上openssl-devel依赖,否则大模型HTTPS接口调用失败;
  2. 大模型输出携带思考链,SQL提取失败:选用不带推理思考的模型,增加正则过滤多余文本;
  3. Streamlit外部无法访问:启动参数添加--server.address 0.0.0.0,开放局域网访问;
  4. MySQL8.0认证插件报错:修改root账号认证方式为mysql_native_password
  5. .env密钥泄露风险:必须执行chmod 600,禁止其他用户读取配置文件。

八、项目拓展优化方向

  1. 权限精细化:增加Web页面登录鉴权,区分普通查询用户与调优管理员;
  2. 多表关联支持:扩展表结构,支持多表JOIN场景NL2SQL生成;
  3. 慢SQL批量分析:支持批量导入多条SQL,批量输出索引优化方案;
  4. Docker容器化:打包openEuler、MySQL、Python环境,一键部署;
  5. 本地私有大模型适配:兼容本地部署Qwen/DeepSeek离线模型,无需外网API;
  6. 导出报表:查询结果支持Excel下载,自动生成业务分析报告文件。

九、项目总结

  1. 落地价值:轻量化一站式AI数据库工具,零SQL基础业务人员可自主查询数据,解放DBA重复调优工作,适配中小企业轻量化数据平台;
  2. 技术学习点:覆盖国产openEuler运维、MySQL8.0深度运维、Python分层架构、大模型Prompt工程、NL2SQL落地、Streamlit低代码Web开发、systemd服务部署;
  3. 适用人群:计算机专业实训项目、运维工程师、后端开发、AI应用开发学习者完整实战案例;
  4. 部署门槛:低配虚拟机即可运行,3天完整从零搭建完成,代码模块化易二次开发改造。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/9 4:30:43

技能原生大模型与长程推理基准:破解复杂任务评估难题

当你的大模型在回答一个看似简单的多步骤问题时,比如“帮我规划一个从北京到上海的旅行,需要考虑天气、交通、景点和预算”,它是否经常在第三步就“失忆”,忘记了第一步设定的预算约束,或者给出的景点推荐完全不符合当…

作者头像 李华
网站建设 2026/8/9 4:27:03

PostgreSQL向量搜索实战:pgvector安装、索引优化与RAG系统构建

1. 从关系型到向量化:为什么你的PostgreSQL需要pgvector最近和几个做AI应用的朋友聊天,发现一个挺有意思的现象:大家一提到向量搜索,第一反应就是去搞个专门的向量数据库,比如Milvus、Pinecone或者Weaviate。这当然没问…

作者头像 李华
网站建设 2026/8/9 4:24:52

哈希技术:从基础实现到工程优化全解析

1. 为什么每个程序员都该掌握哈希技术?第一次参加技术面试时,我被问到一个经典问题:"如何快速判断用户输入的密码是否正确?"当时我支支吾吾地回答可以用遍历比较,面试官失望的表情至今难忘。直到后来系统学习…

作者头像 李华
网站建设 2026/8/9 4:22:18

工业陶瓷榜单:国内精密工业陶瓷零部件供应商综合选型参考

在设备开发与硬件设计工作当中,工业陶瓷凭借高硬度、耐化学腐蚀、绝缘性能好、热膨胀系数低等材料特性,大量应用于耐磨组件、绝缘配件、特种结构件等场景。很多硬件工程师、供应链从业者在选型阶段会遇到不少现实难题,市场上供应商数量较多&a…

作者头像 李华
网站建设 2026/8/9 4:20:14

如何不联网把截图文字提取出来?纯本地OCR工具实操解析

文章目录为什么我们需要离线截图转文字?一款内置本地OCR引擎的系统工具三步完成文字提取,操作毫无门槛识别后的自动修正,告别破碎的段落离线所赋予的,是一种确定的安心感为什么我们需要离线截图转文字? 当你在电脑上截…

作者头像 李华