内容目标
- 学习如何使用 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,可以生成跨表关联查询
- 应用场景:适用于复杂业务查询,如员工信息与部门预算的联动分析
练习题
-
实践查询生成:
修改查询条件,让 OpenAI 生成一个查询语句,找出预算大于 300,000 且部门中员工平均工资超过 7000 的部门名称。 -
优化查询:
使用 OpenAI 请求优化生成的 SQL 查询,确保执行效率更高。