【AI】我没写一行 SQL,就让 AI 查出了销售报表
你有没有想过,不写 SQL,不开发前端图表,甚至不懂数据库结构,仅通过“聊天”的方式,就能查询销售数据?
这次我尝试了一件事:用大模型来构建一个“对话式 BI 系统”。目标是:
完全不写代码
用自然语言提问
让 AI 代替我处理 Excel → 数据库 → SQL → 图表的全过程
当然,它远远谈不上成熟,更别说能替代现有的 BI 工具,但这次尝试带来了不少收获,也暴露了许多关键问题。这篇博客会完整记录我这一路“用 AI 做 BI”的过程,以及对几个主流大模型表现的观察、对比和吐槽。
如果不是一个程序员来做,会碰到什么?
使用大模型时碰到的问题,不同的思维模式(用 chatgpt 和 qwen,gemini 一开头就没理解所以就不用了)
数据准备 &手上有的环境
excel 表格,有一些销售情况。表头都是中文,表关联的字段名相同。
PC 有 Go 语言开发环境(v1.20),cursor(v0.49)
服务器有部署一个 MySQL(5.7)
服务器有 python 环境(3.10)
对话工具,deepchat(v0.1.1)
实现步骤
让 AI 写一个代码来把 excel 表格的数据导入 MySQL 数据库,假装是一个销售日常报表的数据源
让 AI 写一个 MySQL 的 mcp server,实现读的相关功能
用 deepchat 加载 MySQL 的 mcp server,问一些销售情况的问题
Excel 描述
.xlsx 文件
12 Sheets
每个 Sheet 表头有唯一 id,名称不固定
每个 Sheet 表头字段除了 id 都是中文
用 AI 写把 Excel 文件导入数据库的代码
这边就不贴代码了
耗时:2h
模型
ChatGPT-4o
QWen3-235B-A22B
R 代表 Round
R1:第一版代码
提示词:”我想要把这个 excel 表格里面的所有 sheet,导入到 mysql 数据库,给我 python 代码“ + 上传 excel 文件
ChatGPT-4o
输出
给 pip install 的指令,要安装一些包,然后一份导入的 python 代码
额外的注意事项提示,表名处理,数据类型自动推断,安全建议
执行后
表名是中文,表字段是中文
QWen3-235B-A22B
输出
给 pip install 的指令,要安装一些包,然后一份导入的 python 代码
额外的注意事项提示,表名命名规则,字段类型自动推断,重复导入行为,中文支持问题
执行后
表名是中文,表字段是中文
小结
给出的 pip install,没有跟上国内的源下载会很慢(如果你在安装 python 的时候有默认修改那没事,不过一般是不会有)。没有改的话,可能在 pip install 就可以等半天了,这几个还是小的依赖包。
没有说明 excel 表格内的 Sheet 名称和表头都是中文,所以生成的表以及表字段都是中文。这边可能不是开发或者没有碰过数据库的,表名是中文不是说不行,就是很奇怪,而且常规开发都是要用英文字段。所以下一步转换成英文,有可能有人就不会去修改,就直接去用了。
这边其实还跳过了很多,部署 MySQL,创建数据库,安装 python,这几步可能非开发就要绕一绕了。
这一步我也试了 gemini 2.5pro,但是它一直说我上传的不是 xlxs 是 csv,而且没有多个 sheet,所以我就直接放弃了。
R2:修改成英文的
提示词:”我还需要把每个表的中文字段改成英文的,不然数据库里面的表字段都是中文了”
ChatGPT-4o
输出
解决方案逻辑:读取每个 Sheet,提取首行字段名(中文),自动将中文列名翻译为英文,重命名列后导入 MySQL。
会再询问:要不要我先帮你提取所有 sheet 的字段列表?你确认翻译后,我再生成导入脚本。这样最稳妥。是否继续?
执行后
执行后,代码卡了很久,执行不了。我感觉是用了 googletrans ,是不是跑到外网去了。
QWen3-235B-A22B
输出
提供了一个 Sheet 的转换代码
会再询问:如果你能提供完整的列名列表,我可以帮你更完整地定义
column_mapping
。是否需要我继续为你整理所有列名?
执行后
这个不是全部,我没有执行
小结
这一步 2 个大模型的思维就发生了变化,我感觉 ChatGPT 会更自动一点,不会先想说我用一个 map 来把已经有的做一个关系映射,而是时时想着我需要自动去实现。这一个思维其实对我的感官确实不一样,先不说卡的问题,这表示我的思维也要变成,事事需要想想全部变成自动化,抽象来做。
QWen 的模型直接写了一个 map 来对应,中文跟英文。我觉得也没问题,这样看得也清楚,也比较稳定。而且提供了一个小的版本,来让我先确定是不是要这样做,要的话再跟他说。
ChatGPT 的方式可能会让一些人卡住,因为不知道是什么问题,当然再去问大模型为什么跑这么久,可能大模型会改个方法出来,我就不知道了。如果不去问,可能有些人也不会说要改成 map 的形式。
R3:要全部的 sheet 字段的 map 关系
ChatGPT-4o
提示词:能不能直接用每个 sheet 字段 map 的方式,直接定义好,全部的 map 关系
输出
只给了我哪些字段要转换,是要让我填转换后的英文名称
会再询问:请你填上每个中文字段对应的英文字段(可以粘贴回我这里),我随后会帮你生成一个完整的字段映射字典和导入脚本。是否继续?
执行后
没有执行,因为还要我去手动填,有好多字段
QWen3-235B-A22B
提示词:我需要所有的 sheet 的 map
输出
给了我全部转换的中文跟英文的定义,不过还没有写到代码里面
执行后
没有输出新代码,没有执行
小结
ChatGPT 很有意思,感觉它的下一步都要让我帮它填,然后再问你要不要我帮你做下一步。这种引导的方式,让你参与这个过程,好像也没有毛病,可能用这种方式来加深学习的印象还挺好。
Qwen 是给了我全部的字段对应关系,不过这是给了我一个变量,并没有直接改到代码里面。不过这边发现了一个致命问题,我是到后面才发现的,**漏了 2 个表的字段映射。我前面说的我有 12 个 Sheet,我没看出来少了 2 个表,这个对大规模的项目,估计这个坑会有点深。另外还自己修改了 2 个 Sheet 的名字**,这样在代码执行的时候会对应不上,导入数据的时候又会报错。
说明对于让大模型来处理那种数量要一致的,要留个心眼,或者让它自证一下。
R4:合并到代码里面去
ChatGPT-4o
提示词:可以
输出
只给了我哪些字段要转换,是要让我填转换后的英文名称
会再询问:是否还需要:将表名也翻译成英文(或转拼音)?追加模式(append)而不是覆盖(replace)?添加主键或索引?
执行后
没有执行,因为问了我是否要把表名翻译成英文
QWen3-235B-A22B
提示词:我需要你帮我都写到 python 代码里面,能够创建表,如果存在就删除,然后把数据写入数据库
输出
第二版代码
会再询问:如需添加字段清洗、空值处理、批量导入优化等功能,请告诉我,我可以继续帮你完善 😊
执行后
执行了,表名还是中文,字段是英文了
小结
ChatGPT 每一步的询问感觉都还挺在点上的,而且只需要你回答是否可以,继续,这种。Qwen 虽然也有询问是否要做什么什么,不过那些偏专业,对真的开发代码的人还是有帮助的,不过对非开发,感觉也看不懂说的是什么。
ChatGPT 回答后再经过 2 轮,它给了最后代码。因为给了转换后的表名,让我确认,确认了才合到代码里面。(这边就先跳过)
Qwen 这边虽然提示词有说创建表,不过它没有意识到表名称也可能是中文,这个跟 ChatGPT 是不一样,ChatGPT 可能只是习惯性问下表名要不要改中文,而 Qwen 是直接忽略。
R5:问创建表的 SQL 包含索引
ChatGPT-4o
提示词(并非提示词,是个过程):改成代码后,让它同时在代码里面加上索引,是直接默认选择表里面 _id 的字段,我以为是会让我选择指定,所以后面我就换成,直接给我创建表的 SQL,包含主键。
输出
给了我创建数据库的 SQL 包含索引的创建
执行后
执行后成功创建表
QWen3-235B-A22B
提示词:你先给我表的创建 sql 吧,我直接在创建表的时候创建 index
输出
给了我创建数据库的 SQL 包含索引的创建
执行后
创建没有问题,创建成功
小结
Qwen 给我的是英文的表名,但是没有给我更新后的脚本,脚本还是中文的表名,并没有提示我。
索引这一句,估计非开发又不知道什么是数据库索引,所以这一步有可能很多人就直接跳过了。
这一步过去到创建表的 SQL,估计也有人不知道要去哪里执行。
R6:要最后导入数据的脚本
ChatGPT-4o
提示词:那你在给我修改后的 python 代码,只要写入数据的就行,不用在管表是否存在
输出
第二版代码
执行后
数据成功写入
QWen3-235B-A22B
提示词:那你在给我修改后的 python 代码,只要写入数据的就行,不用在管表是否存在
输出
第三版代码
执行后
提示少了
员工
表对应关系
小结
ChatGPT 到这一步就 OK 了,导入数据也就完成了。
Qwen 代码直到这版执行,才发现原来少了 2 个表,后面更新了一版,发现又少了 1 个表。其实从 R2 就已经漏了,我到这步才发现。当然,加上去之后就是好的了。
不过整个过程,还涉及到删除数据库表,清空表内容。因为脚本没有记录已经成功导入的表,每次执行都会再重新来一次。但是我们前面设置了主键,主键是不能重复的,不是改了代码,再执行就 OK 的了。如果没有删除,会有
primary key duplicate
的报错,这个报错可以通过询问大模型解决,不过得绕多几次。数据库的可视化工具,也是一个问题,可能大模型会让你去用指令删除数据和表。
用 Cursor 写 mysql go mcp server
模型:claude sonnet 3.7
R1:空目录创建一个 mysql go mcp server
也不能说空目录,只不过是在我的一个 mcp server 目录下,创建一个新的目录来实现这个功能
提示词:在 mysql-mcp-server/server 里面帮我实现一个 mysql 的 mcp server,用 go-mcp 实现,我只需要读的功能。
输出:有些许代码报错,因为在引用 go-mcp 的时候估计是搜索到旧文章,所以用的方法不对。大体都已经出来了。
R2:按照我这个根目录下其他实现方式修改
因为我前面已经写过了其他例子,所以我直接让它按照其他目录里面的实现
提示词:注册方法跟 xxx 里面的注册方式保持一样
输出:修改一致,可以编译
R3:修改 bug,deepchat 调用后,不知道报了什么错,直接丢给 cursor

提示词:报错内容
输出:因为返回的接口体内容,不符合 go-mcp 要求,所以又根据已有项目代码修改了逻辑。
R4:修改查询错误
错误描述:问的内容是返回一个加总的值,但是返回一个数组,查了 deepchat 调用 mcp server 的 SQL 也是没有问题的。

提示词:为什么调用 tool mysql query 的时候这个 sql ‘SELECT order_amount FROM orders WHERE customer_id = (SELECT customer_id FROM customers WHERE customer_name = '蔡伟')’返回的是一个数组,而我直接执行 sql 的时候只返回一个数值
输出:答的不是我想要的
R5:讲清楚问题
提示词:
输出:修改正确

R6:优化返回
这一步主要是在问 deepchat 的过程中,大模型有些理解的有问题,以及我返回出来的结果可能会影响对大模型的输入,所以
提示词:你觉得怎么拼回传的 content 可以让大模型更看得懂,从而可以给用户说的清楚,甚至可以给到大模型去生成一些趋势图之类的
输出:这个是修改内容,确实比之前的形式更好一点
用 Deepchat + mysql mcp server 去询问销售情况
模型:deepseek-chat
这边只是简单列了一下总结
询问的问题只涉及到单表的都没有问题,能回答
涉及到多个的时候就不行了,以及涉及到一个专有的表字段,比如 kp 数,可能就乱来了。原本 deepchat 是会通过我的 tool 里面有一个 查看数据库表信息来获取相关的表字段,从而能够拼出 SQL,不过这一个目的可能无法实现,或者说是我的这个接口返回的信息不够好。

这个不了解表的问题,有可能是大模型能力还不够,也有可能是我接口返回信息写的不够好。不过不纠结,原本我也有这个打算。因此,我接着前面问 ChatGPT 的对话,让它帮我再生成这些表的描述。
提示词:帮我生成这个表以及表字段的说明内容,我要给大模型去生成精确的 sql 指令。输出:原本只是给了几个表格,不过问我 “如需我再生成:JSON Schema 描述?数据库表之间的关系图?生成适用于自然语言 → SQL 的提示模板?我也可以继续帮你生成。需要吗?“。我觉得生成 json 好像对大模型来说理解更好,然后就保存成 json 格式在用 deepchat 问题的时候,就先上传这个 json 文件。
事实证明,配上表描述,表字段描述,效果非常不错。问题:这些没有新增 kp 的都是什么部门的,哪个部门的最多?
总结
AI 的确帮我自动完成了数据导入、表结构设计、SQL 拼接,甚至能生成可用的查询结果。但整个过程中,我也碰到了不少非程序员很可能会被卡住的问题,比如字段名不统一、索引缺失、模型理解错误等。
结论是:自然语言 BI 并不是空谈,但仍需配合大量“人类经验”和“架构设计”来兜底。
未来,我觉得几个方向值得继续实验:
如何让 Agent 来自动理解并拼接更复杂的查询逻辑?
表结构设计本身如果不合理,AI 的理解能力还能不能兜得住?
如果不是我自己做,而是一个不懂技术的人来操作,这套流程会不会直接崩溃?
这个实验还在继续,也欢迎你和我一起交流碰撞更多的思路。数据还不够多,所以图的部分还没实验。
评论