96SEO 2026-09-09 11:32 4
最近在学大模型应用开发。发现 Text2SQL 这个方向特别有意思——把自然语言翻译成 SQL 语句,让不懂技术的人也能查数据库。怎么说呢,踩了不少坑,从 SQLite 建表到 prompt 模板设计。把整个流程走通了整理出来分享给大家。

技术栈: Python + SQLite + DeepSeek API
在学 Text2SQL 之前,得先搞清楚我们要查的数据库长什么样。不过,这里用的是 SQLite——它最大的特点是零配置、单文件。老实说,
| 特性 | SQLite | MySQL / PostgreSQL |
|---|---|---|
| 安装方式 | No install。Python 内置 sqlite3 | User‑managed service & config required |
| 存储形式 | .db 文件 | Mature server process |
| 适用场景 | 本地开发、教学、嵌入式项目 | 高并发、大规模生产环境需要专门部署与调优。 |
| 💡 一句话记住: SQLite 就是把整个数据库塞进一个文件里打开就能用。 | ||
import sqlite3
# 连接数据库
conn = sqlite3.connect
cursor = conn.cursor
# 建表
cursor.execute("""
CREATE TABLE IF NOT EXISTS employees(
id INTEGER PRIMARY KEY。name TEXT,department TEXT,salary INTEGER
)
""")
conn.commit
❗ 面临痛点: 很多人因为忘记 commit 导致数据瞬间丢失。至于方法,每次 DML 操作后务必 commit。或者开启自动提交模式,
sqlite3.connect: 连接到 test.db —如果不存在就新建。conn.cursor: 创建游标对象,所有 SQL 操作都通过它执行。"CREATE TABLE IF NOT EXISTS": 如果表已存在则跳过避免报错。"INTEGER PRIMARY KEY": 整数主键,自动递增。"TEXT": SQLite 的字符串类型;可用于存储中文字段名和内容。
# Sample data
sample_data =
cursor.executemany VALUES ",sample_data)
conn.commit # ⚠️ 不 commit 数据就丢了
print
commit 的作用
💡 使用者痛点: 没有 commit 时所有修改只在内存里一旦程序异常退出就全失。sql
内存中的修改 ──commit──→ 磁盘上的 .db 文件
一句话:commit 是把"草稿"变成"定稿”。
二、Text2SQL:让大模型帮你写 SQL
💬 使用者痛点之一: “我想知道工程部门员工的平均工资,但不知道怎么写复杂的 JOIN 或 GROUP BY。”
这正是 Text2SQL 能解决的问题。
主要思路
⚙️ 常见痛点: 没有明确输入 Schema → 模型生成无效或错误的 SQL;输出包含注释或多余解释无法直接执行。按理说,
A step‑by‑step illustration:
# 使用者提问:
"工程部门员工的姓名和工资是多少?"
Prompt = “这是一个数据库的schema:
CREATE TABLE employees;
怎么说呢,根据这个schema,请输出一个SQL查询来回答以下问题。不包含任何注释或代码块,问题这方面,工程部门员工的姓名和工资是多少?”
SELECT name,salary FROM employees WHERE department = '工程';
PROMPT ENGINEERING TIP:\
-
No markdown fences . Just raw SQL.
\
-
If you want a list of columns only use `SELECT *` or explicit names.
\
-
Add a clause like “不要包含反引号或额外说明” to enforce strictness.
\
-
If model fails due to ambiguous phrasing。ask for clarification or provide default time window.
\
-
You can also feed a small example pair for few‑shot learning.
\
"
+ "*Tip:* Always test generated query on a small sample before running on production.*"
+ ""
+
完整代码实现
python
from openai import OpenAI
client = OpenAI(
api_key="",# DeepSeek API Key or OpenAI key
base_url="https://api.deepseek.com" # DeepSeek endpoint compatible with OpenAI spec
)
def ask_deepseek -> str:
"""Convert natural language query into executable SQL."""
prompt = f"""
这是一个数据库的schema:{schema}
根据这个schema,请输出一个SQL查询来回答以下问题。不要包含反引号、代码块标记或额外说明。话说回来,问题这方面,{query}
"""
response = client.chat.completions.create(
model="deepseek-v4-flash",max_tokens=150。messages=
)
return response.choices.message.content.strip
# Key takeaways:
-
- Set correct base_url for your provider;- Keep prompt concise yet explicit.
- Restrict output to raw SQL only.
# Common pitfalls:
-
- Model might wrap result in triple backticks → strip m.
- Generated query may reference non‑existent columns if schema incomplete.
至于串联运行。从提问到拿结果
python
import sqlite3
from texttosql import ask_deepseek
conn = sqlite3.connect
cur = conn.cursor
cur.execute
tables_sql = "
".join])
question = input
generatedsql = askdeepseek
print
从try来看,results = cur.execute.fetchall
except Exception as e:
print}")
else这方面,print
for row in results:
print
conn.close
The console will show something like:
✅ Generated SQL:
SELECT name,salary FROM employees WHERE department ='工程'
🟢 查询结果:
三、Schema 提取:怎么告诉模型数据库长啥样?⚠️ 使用者痛点二 : “我不知道该怎么把我的表结构传给模型”。这一步是关键,否则会出现无效查询。正确做法是把结构信息压缩成文本并粘贴给 Prompt。两种常见方案如下,
方式一的观点是,直接读取 sqlite_master 中 CREATE TABLE 声明
👍 优势 | 快速原型 | 输出完整性高 | 无需手工拼接
⚙️ 劣势 | 对大型 DB 会产生冗余 | 难以自定义列顺序/约束
↙
cursor.execute
tables_sqls= for row in cursor.fetchall]
schema_str="
".join
print
Output example:
CREATE TABLE employees(
id INTEGER PRIMARY KEY。name TEXT,department TEXT,salary INTEGER
);怎么说呢,CREATE TABLE departments(
id INTEGER PRIMARY KEY。name TEXT,manager TEXT
);
方式二这方面,PRAGMA table_info 自己拼装字段列表
*当你只需要某些字段时非常实用*
👍 灵活 | 可删除无关列 | 支持自定义格式
⚙️ 劣势 | 写法略长 | 有时缺少完整约束信息
↙
tables=
schema_str=""
for table in tables:
cols=cursor.execute").fetchall
col_defs=} {col}" for col in cols]
schema_str+=f"CREATE TABLE {table} (
"
schema_str+="\t"+"。".join+"
"
schema_str+=");"
print
Output example:
CREATE TABLE employees (
name TEXT。department TEXT,salary INTEGER,id INTEGER PRIMARY KEY);
特性/维度 manual extraction via PRAGMA table_info manual extraction via SELECT sql FROM sqlite_master
代码量
仅需两行 vs 五十多行
简单易读 vs 相对繁琐
— 单表简单场景可直接使用;其实,— 支持自定义列顺序 & 可移除无关字段
— 一键拿下所有表结构;— 输出保留全部约束与索引信息
输出完整性
包含完整 CREATE …,含索引与默认值 vs 列名 + 类型仅限于列名和类型,仅供示例使用
✔︎ 有时候我们只需最小化 Schema 去降低噪音;✔︎ 对复杂语义解析有帮助,让 LLM 更聚焦
✔︎ 把所有细节交给 LLM。可减少手工维护负担
-
Migrating from tiny local DB to production usually requires just changing connection string – no prompt changes needed.
-
If you’re worried about leaking sensitive column names into prompt – consider only passing relevant columns or obfuscating names.
Now we continue with furr sections below…
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback