AIGC 时代如何“让数据库听懂人话”?从 CRUD 到自然语言 SQL 的进化之旅
本文详解如何利用AIGC技术实现自然语言到SQL的自动转换。通过SQLite构建本地员工数据库,结合DeepSeek大模型,仅需一句中文提问,即可生成精准SQL查询。文章逐行注释代码,生动展示从CRUD操作到“说中文查数据”的智能跃迁,揭示AIGC赋能数据库交互的新范式。
引言
“老板,开发部工资多少?”
“我这就查。”
——曾经需要写 SQL 的你,现在只需一句话。
在 AI 大模型(AIGC)席卷一切的时代,连我们最熟悉的 数据库操作 都正在被彻底改变。从前必须手敲 SELECT * FROM employees WHERE department = '开发' 的日子一去不复返了——如今,你只需要说一句:“开发部门员工的姓名和工资是多少?”,AI 就能自动帮你生成正确的 SQL 查询语句!
今天我们就来深入剖析:AIGC 是如何实现自然语言到 SQL 的转换? 并结合一个真实代码案例,带你一步步看懂背后的逻辑与魔法。
案例部署
1. 魔搭部署
登录魔搭社区 魔搭官网,进入 【我的】→【我的Notebook】

启动后点击【查看Notebook】,跳转至如图页面,选择Python 3

分模块输入代码内容后点击运行,生成 text.db 数据库文件,

2. 数据库文件 test.db 查看步骤
首次在 VScode 中下载扩展

按下快捷键(如 Ctrl+Shift+P / Cmd+Shift+P),输入:
SQLite: Open Database

选择 .db 文件

最后按照下图步骤即可查看数据库文件

代码第一步:用 SQLite 搭建本地数据库(无需服务器!)
为什么选 SQLite?因为它简单、高效、无依赖,是微信、浏览器等 App 背后默默工作的本地存储引擎。MySQL 需要服务端部署,而 SQLite 只需一个 .db 文件,完美适配个人项目与原型验证。
代码段 1:导入模块
# 轻量级数据库
import sqlite3
导入 Python 内置的
sqlite3模块,用于操作 SQLite 数据库。无需额外安装,开箱即用。
代码段 2:连接数据库 & 创建表
# 打开链接
conn = sqlite3.connect("test.db")
# 数据库操作的句柄
cursor = conn.cursor()
cursor.execute("""
CREATE TABLE IF NOT EXISTS employees (
id INTEGER PRIMARY KEY,
name TEXT,
department TEXT,
salary INTEGER
)
""")
逐句解析:
sqlite3.connect("test.db"):连接名为test.db的数据库文件。若文件不存在,则自动创建。conn.cursor():获取“游标”(cursor),它是执行 SQL 语句的操作句柄,就像数据库的“遥控器”。cursor.execute(...):执行一条 SQL 语句。CREATE TABLE IF NOT EXISTS employees (...):创建一张名为employees的表,包含四个字段:
id:整数类型,主键(自动递增)name:文本类型,员工姓名department:文本类型,所属部门salary:整数类型,薪资IF NOT EXISTS确保重复运行不会报错。
关键点:SQLite 是独立于 Web 后端的本地数据库实体,适合离线或轻量场景。
代码段 3:插入测试数据
sample_data = [
(6, "王五", "开发部", 32000),
( 7, "张三", "销售部", 20000),
( 8, "赵六", "开发部", 33000),
( 9, "李四", "销售部", 15000)
]
cursor.executemany('INSERT INTO employees VALUES (?, ?, ?, ?)', sample_data)
conn.commit()
逐句解析:
- 定义
sample_data列表,包含 4 条员工记录(注意 ID 从 6 开始,可能是为了演示非连续主键)。cursor.executemany(...):批量执行插入操作,效率远高于单条循环。'INSERT INTO employees VALUES (?, ?, ?, ?)':使用?作为占位符,防止 SQL 注入攻击,安全又规范。conn.commit():提交事务,确保所有更改永久写入数据库。若不提交,数据会丢失!
这就是经典的 CRUD 中的 “C”(Create)。
代码第二步:提取数据库 Schema(给 AI 的“说明书”)
为了让大模型知道“表长什么样”,我们需要提供结构描述(Schema):
# 通过table_info 拿到employees 表的描述
# llm 生成sql 提供上下文
schema = cursor.execute("PRAGMA table_info(employees)").fetchall()
schema_str = "CREATE TABLE EMPLOYEES (\n" + "\n".join([f"{col[1]} {col[2]}" for col in schema]) + "\n)"
print("数据库Schema:")
print(schema_str)
逐句解析:
PRAGMA table_info(employees):SQLite 特有命令,返回表的元信息(字段名、类型等)。fetchall():获取所有行结果。- 构造
schema_str字符串,模拟标准CREATE TABLE语句格式,便于 LLM 理解。- 最终输出类似:
CREATE TABLE EMPLOYEES ( id INTEGER name TEXT department TEXT salary INTEGER )
💡 为什么需要 Schema?
因为 LLM 不知道你的表叫什么、有哪些字段。提供 Schema 就像给翻译官一本词典,让它能准确“转译”。
代码第三步:调用 DeepSeek 大模型,实现“自然语言 → SQL”
现在进入 AIGC 的核心环节——让 AI 根据你的中文问题,生成可执行的 SQL。
代码段 4:配置 DeepSeek API 客户端
from openai import OpenAI
client = OpenAI(
api_key='sk-c031736e926b4608ba8603be5750d572',
base_url='https://api.deepseek.com/v1'
)
✅ 逐句解析:
- 导入兼容 OpenAI 协议的客户端(DeepSeek 支持该协议)。
- 初始化
client,指定:
api_key:完全保留原始值(实际使用请替换为自己的密钥!)base_url:指向 DeepSeek 的 API 入口
注意:此 API Key 仅为示例,请勿在公开场合泄露真实密钥!
API Key获取地址:DeepSeek 开放平台
代码段 5:定义 AIGC 生成函数(核心魔法!)
def ask_deepseek(query, schema):
prompt = f"""
这是一个数据库的Schema:
{schema}
根据这个Schema,你能输出一个SQL查询来回答以下问题吗?
只输出SQL查询,不要输出任何内容,也不要带任何格式
问题:{query}
"""
# print(prompt)
response = client.chat.completions.create(
model="deepseek-reasoner",
max_tokens=2048,
messages=[{
"role": "user",
"content": prompt
}]
)
return response.choices[0].message
# ask_deepseek("开发部部门员工的姓名和工资是多少?", schema)
question = "开发部部门员工的姓名和工资是多少?"
sql = ask_deepseek(question, schema_str)
print("生成的sql查询:")
print(sql)
1. 函数定义
def ask_deepseek(query, schema):
接收两个参数:
query:用户的自然语言问题(如“开发部...”)schema:数据库结构描述
2. 构造 Prompt(提示词工程的核心!)
prompt = f"""
这是一个数据库的Schema:
{schema}
根据这个Schema,你能输出一个SQL查询来回答以下问题吗?
只输出SQL查询,不要输出任何内容,也不要带任何格式
问题:{query}
"""
- 明确告诉 AI 当前数据库结构
- 强调指令:“只输出 SQL 查询,不要输出任何内容,也不要带任何格式”
- 这种约束极大提升了输出的可用性——避免 AI 添加解释、Markdown 或多余字符
3. 调用大模型 API
response = client.chat.completions.create(
model="deepseek-reasoner",
max_tokens=2048,
messages=[{
"role": "user",
"content": prompt
}]
)
- 使用
deepseek-reasoner模型(专为逻辑推理优化)- 设置足够长的
max_tokens,避免截断复杂 SQL- 以标准 Chat 格式发送请求
4. 返回结果
return response.choices[0].message
获取 AI 生成的第一条回复内容(即纯 SQL 字符串)
5. 实际调用
question = "开发部部门员工的姓名和工资是多少?"
sql = ask_deepseek(question, schema_str)
print("生成的sql查询:")
print(sql)
- 提问关于“开发部”的员工信息
- 打印 AI 生成的 SQL
这就是 AIGC 的魔力:将人类语言(Human Language)翻译成机器语言(SQL),实现 自然语义数据库操作。
6. 输出示例
SELECT name, salary FROM employees WHERE department = '开发';
🎉 成功!AI 把中文问题准确地翻译成了标准 SQL!
AIGC 如何“理解”并生成 SQL?
让我们深入看看 AI 是怎么做到这一点的:
1. 上下文感知(Context Awareness)
AI 看到了完整的 Schema,知道:
- 表名叫
employees - 字段有:
name,department,salary department是字符串类型
2. 意图识别(Intent Recognition)
AI 分析问题:“开发部门员工的姓名和工资是多少?”
- 关键词提取:
开发部门→ 对应department = '开发' - 查询目标:
姓名和工资→ 对应name, salary
3. 语法生成(Grammar Generation)
AI 根据 SQL 语法规则,组合出:
SELECT name, salary
FROM employees
WHERE department = '开发';
🤯 整个过程就像一位“数据库翻译官”:把人的语言翻译成机器能懂的语言。
未来展望:AIGC + 数据库 = 新一代生产力工具
| 传统方式 | AIGC 方式 |
|---|---|
| 必须记住表名、字段名 | 自动识别字段 |
| 容易写错 SQL | 几乎零错误率 |
| 需要调试 | 一键生成 |
未来的趋势将是:
- 低代码/无代码平台 中集成 AI SQL 生成器
- 数据分析人员 无需学习 SQL,也能高效查询
- 智能助手 可实时回答业务问题(如:“本月销售额最高的产品是哪个?”)
结语:数据库不再高冷,人人都是数据分析师
过去,数据库是程序员的专属领域;
今天,借助 AIGC,任何人都可以用自然语言与数据对话。
🔥 从“写 SQL”到“说中文”,
这不是技术的进步,而是认知的解放。
当你下次再问:“开发部工资多少?”时,别忘了——
背后可能正有一个 AI 在默默为你生成 SQL。
附录:
1. 完整可运行代码(Python + DeepSeek)
源码地址:python/text2sql/text2sql.ipynb · Zou/lesson_zp - 码云 - 开源中国
# 轻量级数据库
import sqlite3
# 打开链接
conn = sqlite3.connect("test.db")
# 数据库操作的句柄
cursor = conn.cursor()
cursor.execute("""
CREATE TABLE IF NOT EXISTS employees (
id INTEGER PRIMARY KEY,
name TEXT,
department TEXT,
salary INTEGER
)
""")
sample_data = [
(6, "王五", "开发部", 32000),
( 7, "张三", "销售部", 20000),
( 8, "赵六", "开发部", 33000),
( 9, "李四", "销售部", 15000)
]
cursor.executemany('INSERT INTO employees VALUES (?, ?, ?, ?)', sample_data)
conn.commit()
from openai import OpenAI
client = OpenAI(
api_key='sk-c031736e926b4608ba8603be5750d572',
base_url='https://api.deepseek.com/v1'
)
# 通过table_info 拿到employees 表的描述
# llm 生成sql 提供上下文
schema = cursor.execute("PRAGMA table_info(employees)").fetchall()
schema_str = "CREATE TABLE EMPLOYEES (\n" + "\n".join([f"{col[1]} {col[2]}" for col in schema]) + "\n)"
print("数据库Schema:")
print(schema_str)
def ask_deepseek(query, schema):
prompt = f"""
这是一个数据库的Schema:
{schema}
根据这个Schema,你能输出一个SQL查询来回答以下问题吗?
只输出SQL查询,不要输出任何内容,也不要带任何格式
问题:{query}
"""
# print(prompt)
response = client.chat.completions.create(
model="deepseek-reasoner",
max_tokens=2048,
messages=[{
"role": "user",
"content": prompt
}]
)
return response.choices[0].message
# ask_deepseek("开发部部门员工的姓名和工资是多少?", schema)
question = "开发部部门员工的姓名和工资是多少?"
sql = ask_deepseek(question, schema_str)
print("生成的sql查询:")
print(sql)
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)