让 AI 帮你写 SQL:用 DeepSeek + SQLite 实现自然语言查数据库
只需几十行 Python 代码,就能让大模型听懂“研发部工资多少”,并自动生成正确 SQL。
核心思路
- 用 SQLite 创建一个简单表
- 提取表结构(Schema)作为上下文
- 将自然语言问题 + Schema 发给 DeepSeek 大模型
- 模型返回可执行的 SQL
完整代码
import sqlite3
from openai import OpenAI
# 1. 创建数据库
conn = sqlite3.connect("test.db")
cursor = conn.cursor()
cursor.execute("""
CREATE TABLE IF NOT EXISTS employees (
id INTEGER PRIMARY KEY, -- ✅ 修正:原为 PRIMSRY KEY
name TEXT,
department TEXT,
salary INTEGER
)
""")
sample_data = [
(2, "母猪会上树", "研发部", 35000),
(3, "咕咕嘎嘎噶", "销售部", 12000),
(4, "努力进大厂", "研发部", 20000),
(5, "超人不会飞", "销售部", 30000)
]
cursor.executemany('INSERT INTO employees VALUES (?, ?, ?, ?)', sample_data)
conn.commit()
# 2. 获取 Schema
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)"
# 3. 调用 DeepSeek 生成 SQL
client = OpenAI(
api_key='sk-你的-api-key',
base_url='https://api.deepseek.com/v1'
)
def ask_deepseek(query, schema):
prompt = f"""
这是一个数据库的schema:
{schema}
根据这个schema,输出一个SQL查询来回答以下问题。
只输出SQL,不要任何其他内容。
问题:{query}
"""
resp = client.chat.completions.create(
model='deepseek-reasoner',
messages=[{"role": "user", "content": prompt}]
)
return resp.choices[0].message.content
# 4. 测试
question = "研发部部门员工的姓名和工资是多少?"
sql = ask_deepseek(question, schema_str)
print(sql)
✅ 输出:
SELECT name, salary FROM EMPLOYEES WHERE department = '研发部';
关键点说明
- Schema 必须准确:模型依赖它理解字段名和类型。拼写错误(如
PRIMSRY KEY)虽可能被容忍,但应避免。 - 提示词要明确:强调“只输出 SQL”,防止模型加解释或 Markdown。
- 安全第一:切勿在生产环境直接执行模型生成的 SQL,建议做语法校验或限制只读权限。
适用场景
- 内部数据查询工具
- BI 系统的自然语言入口
- 快速验证数据分析想法
💡 完整 Notebook 已公开: [魔搭社区]