OpenAI 实战进阶教程 - 第七节: 与数据库集成 - 生成 SQL 查询与优化

内容目标
  • 学习如何使用 OpenAI 辅助生成和优化多表 SQL 查询
  • 了解如何获取数据库结构信息并与 OpenAI 结合使用

实操步骤

1. 创建 SQLite 数据库示例

创建数据库及表结构:

python 复制代码
import sqlite3

# 连接 SQLite 数据库(如果不存在则创建)
conn = sqlite3.connect("company_data.db")
cursor = conn.cursor()

# 创建 employees 表
cursor.execute('''
CREATE TABLE IF NOT EXISTS employees (
    id INTEGER PRIMARY KEY,
    name TEXT,
    department_id INTEGER,
    salary REAL,
    hire_date TEXT
)
''')

# 创建 departments 表
cursor.execute('''
CREATE TABLE IF NOT EXISTS departments (
    id INTEGER PRIMARY KEY,
    name TEXT,
    budget REAL
)
''')

# 插入示例数据
cursor.executemany('''
INSERT OR IGNORE INTO employees (id, name, department_id, salary, hire_date)
VALUES (?, ?, ?, ?, ?)
''', [
    (1, "Alice", 1, 8500, "2022-03-15"),
    (2, "Bob", 2, 6200, "2023-05-01"),
    (3, "Charlie", 1, 9300, "2021-11-12"),
])

cursor.executemany('''
INSERT OR IGNORE INTO departments (id, name, budget)
VALUES (?, ?, ?)
''', [
    (1, "Engineering", 500000),
    (2, "HR", 150000)
])

conn.commit()
conn.close()
print("Database setup complete.")

2. 自动读取数据库结构信息

使用 PRAGMA table_info() 查询元信息,以便将表结构传递给 OpenAI:

python 复制代码
def get_table_info(db_name):
    conn = sqlite3.connect(db_name)
    cursor = conn.cursor()

    # 获取所有表名
    cursor.execute("SELECT name FROM sqlite_master WHERE type='table';")
    tables = cursor.fetchall()
    
    table_info = {}
    for table_name in tables:
        table_name = table_name[0]
        cursor.execute(f"PRAGMA table_info({table_name});")
        columns = cursor.fetchall()
        table_info[table_name] = [column[1] for column in columns]

    conn.close()
    return table_info

db_name = "company_data.db"
table_structure = get_table_info(db_name)
print("Database Structure:", table_structure)

3. 生成两表关联查询

将数据库结构作为上下文传入 OpenAI,请求生成 SQL 查询:

python 复制代码
import openai

# 设置 API 密钥
openai.api_key = "your-api-key"

# 构建提示信息
table_info_prompt = f"""
The database has the following structure:
Table `employees`: id, name, department_id, salary, hire_date
Table `departments`: id, name, budget
Write an SQL query to find the names of employees in the 'Engineering' department whose salary exceeds 8000.
The query should join the employees and departments tables.
"""

# 调用 OpenAI 生成 SQL 查询
response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=[{"role": "user", "content": table_info_prompt}],
    max_tokens=150
)

sql_query = response['choices'][0]['message']['content']
print("Generated SQL Query:")
print(sql_query)

4. 示例生成结果
复制代码
SELECT e.name
FROM employees e
JOIN departments d ON e.department_id = d.id
WHERE d.name = 'Engineering' AND e.salary > 8000;

小结

  • 元信息读取 :通过 PRAGMA table_info() 获取数据库表结构
  • 查询生成:将表名、字段及业务规则传递给 OpenAI,可以生成跨表关联查询
  • 应用场景:适用于复杂业务查询,如员工信息与部门预算的联动分析

练习题

  1. 实践查询生成

    修改查询条件,让 OpenAI 生成一个查询语句,找出预算大于 300,000 且部门中员工平均工资超过 7000 的部门名称。

  2. 优化查询

    使用 OpenAI 请求优化生成的 SQL 查询,确保执行效率更高。

相关推荐
Li emily3 小时前
解决了加密货币api多币种订阅时的数据乱序问题
人工智能·python·api·fastapi
山川绿水4 小时前
bugku——PWN——overflow2
人工智能·web安全·网络安全
程序员cxuan4 小时前
微信读书官方发了 skills,把我给秀麻了。
人工智能·后端·程序员
2301_781571424 小时前
Golang格式化输出占位符都有什么_Golang fmt占位符教程【通俗】
jvm·数据库·python
fake_ss1984 小时前
AI时代学习全栈项目开发的新范式
java·人工智能·学习·架构·个人开发·学习方法
养肥胖虎4 小时前
RAG学习笔记(3):区分数据库检索与RAG的使用场景
数据库·ai·rag
asdzx674 小时前
使用 Python 为 PDF 添加页码 (详细教程)
python·pdf·页码
nassi_4 小时前
对AI工程问题的一些思考
大数据·人工智能·hadoop
AI技术控4 小时前
《Transformers are Inherently Succinct》论文解读:从“能表达什么”到“多紧凑地表达”
人工智能·python·深度学习·机器学习·自然语言处理
蔡俊锋4 小时前
AI记忆压缩术:从305GB到7.4GB的魔法
人工智能·ai·ai 记忆