《50 行 Python,让 SQLite 听懂中文》

35 阅读2分钟

让 AI 帮你写 SQL:用 DeepSeek + SQLite 实现自然语言查数据库

只需几十行 Python 代码,就能让大模型听懂“研发部工资多少”,并自动生成正确 SQL。

核心思路

  1. 用 SQLite 创建一个简单表
  2. 提取表结构(Schema)作为上下文
  3. 将自然语言问题 + Schema 发给 DeepSeek 大模型
  4. 模型返回可执行的 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 已公开: [魔搭社区]