使用AI构建SQL查询 | 原创,AI翻译
数据库模式 (PostgreSQL):
CREATE TABLE users (
id SERIAL PRIMARY KEY,
username VARCHAR(50) UNIQUE NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
password_hash VARCHAR(255) NOT NULL,
first_name VARCHAR(100),
last_name VARCHAR(100),
date_of_birth DATE,
gender VARCHAR(10),
phone_number VARCHAR(20),
address TEXT,
city VARCHAR(100),
state VARCHAR(100),
country VARCHAR(100),
zip_code VARCHAR(20),
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE,
last_login TIMESTAMP WITH TIME ZONE,
is_active BOOLEAN DEFAULT TRUE,
role VARCHAR(50),
profile_picture_url VARCHAR(255),
bio TEXT,
failed_login_attempts INTEGER DEFAULT 0,
account_balance NUMERIC(10, 2) DEFAULT 0.00
);
上面是Postgre数据库,下面是表定义。以下是自然语言查询指令。
我想获取一些用户,他们的名字是Andy,创建时间在上个月的某一天附近,并且在2025年20岁,并且最近一周内有登录记录,给我查询这些用户的SQL
生成的SQL查询:
SELECT *
FROM users
WHERE first_name ILIKE 'andy'
AND CAST(created_at AS DATE) BETWEEN
(CURRENT_DATE - INTERVAL '1 MONTH' - INTERVAL '1 DAY')
AND
(CURRENT_DATE - INTERVAL '1 MONTH' + INTERVAL '1 DAY')
AND EXTRACT(YEAR FROM AGE(date_of_birth)) = 20
AND last_login >= CURRENT_TIMESTAMP - INTERVAL '7 DAYS';
下面是一个PostgreSQL表定义,用于存储用户与AI系统(如Grok)的交互记录。该表设计用于跟踪对话,包括涉及的用户、对话内容、时间戳和相关元数据。
CREATE TABLE conversations (
id SERIAL PRIMARY KEY,
user_id INTEGER NOT NULL,
title VARCHAR(255),
conversation_type VARCHAR(50) DEFAULT 'chat',
started_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
ended_at TIMESTAMP WITH TIME ZONE,
status VARCHAR(50) DEFAULT 'active',
message_count INTEGER DEFAULT 0,
last_message_at TIMESTAMP WITH TIME ZONE,
is_archived BOOLEAN DEFAULT FALSE,
ai_model_version VARCHAR(100),
total_tokens_used INTEGER DEFAULT 0,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
说明:
- id:每个对话的唯一标识符。
- user_id:引用
users
表,将对话与特定用户关联。 - title:对话的可选标题(例如用户定义或自动生成的摘要)。
- conversation_type:指示对话类型(例如’chat’、’query’、’voice’)。
- started_at:对话开始的时间戳。
- ended_at:对话结束的时间戳(如果未结束则为可空)。
- status:跟踪对话状态(例如’active’、’completed’、’paused’)。
- message_count:跟踪对话中交换的消息数量。
- last_message_at:最新消息的时间戳。
- is_archived:布尔值,表示对话是否已归档。
- ai_model_version:存储使用的AI模型版本(例如’Grok 3’)。
- total_tokens_used:跟踪对话的令牌使用量(适用于API计费或分析)。
- created_at和updated_at:对话记录创建和最后更新的时间戳。
- FOREIGN KEY:确保与
users
表的引用完整性,使用ON DELETE CASCADE
在关联用户被删除时删除对话。
该表设计灵活,可根据特定需求扩展,例如在单独的messages
表中存储个别消息,或添加字段用于情感分析或对话标签。如果需要相关表(例如消息表)或与该表交互的查询,请告诉我!
为了实现一个前端,用户可以使用自然语言查询自己的对话(例如“给我最新的5个对话”或“标题包含java的对话”),需要确保SQL查询将结果限制在经过身份验证的用户的对话上。这涉及将用户身份(例如user_id
)纳入查询,并将自然语言转换为SQL条件。以下是针对conversations
表的提示和对应的SQL查询示例,确保用户只能访问自己的数据。
关键考虑
- 用户身份验证:前端必须将经过身份验证的
user_id
传递给后端,以过滤对话。 - 自然语言解析:将自然语言输入解析为关键条件(例如“最新5”或“标题包含java”)。
- 安全性:始终通过
user_id
过滤,以防止用户访问他人的对话。 - 表引用:使用前面定义的
conversations
表。
自然语言提示和SQL查询
提示1:”给我最新的5个对话”
解析要求:
- 根据经过身份验证的用户的
user_id
过滤对话。 - 按
started_at
(或last_message_at
以获取最新)降序排序。 - 限制结果为5条。
SQL查询:
SELECT *
FROM conversations
WHERE user_id = :authenticated_user_id
ORDER BY started_at DESC
LIMIT 5;
:authenticated_user_id
是登录用户ID的占位符,由前端/后端安全传递。started_at DESC
确保返回最新的对话。LIMIT 5
将输出限制为5个对话。
提示2:”标题包含java的对话”
解析要求:
- 根据经过身份验证的用户的
user_id
过滤对话。 - 搜索标题中包含”java”的对话(不区分大小写)。
- 使用PostgreSQL中的
ILIKE
进行部分、不区分大小写的匹配。
SQL查询:
SELECT *
FROM conversations
WHERE user_id = :authenticated_user_id
AND title ILIKE '%java%';
:authenticated_user_id
确保仅查询用户自己的对话。ILIKE '%java%'
匹配包含”java”的标题(例如“Java技巧”、“关于Java编程”)。
前端实现说明
- 用户身份验证:
- 前端必须从JWT令牌或会话中获取用户的ID(例如
123
)。 - 后端应验证
user_id
并在WHERE
子句中使用它来过滤结果。
- 前端必须从JWT令牌或会话中获取用户的ID(例如
- 自然语言处理:
- 使用简单的基于规则的解析器或AI模型(如Grok)来解释自然语言查询并提取:
- 意图:列出对话。
- 过滤器:关键词(例如“java”),排序(例如“最新”),或限制(例如“5”)。
- 例如,将“最新5”映射为
ORDER BY started_at DESC LIMIT 5
,将“标题包含java”映射为title ILIKE '%java%'
。
- 使用简单的基于规则的解析器或AI模型(如Grok)来解释自然语言查询并提取:
- API设计:
- 创建一个端点(例如
/api/conversations
),接受:user_id
:来自经过身份验证的会话。query
:自然语言输入或结构化参数(例如{ filter: "title contains java" }
)。
- 后端将查询转换为SQL,确保
user_id
始终包含在WHERE
子句中。
- 创建一个端点(例如
- 安全性:
- 绝对不要允许用户直接输入SQL或修改
user_id
过滤器。 - 使用参数化查询(例如
:authenticated_user_id
)以防止SQL注入。 - 验证输入以避免
ILIKE
搜索中的恶意模式。
- 绝对不要允许用户直接输入SQL或修改
- 前端显示:
- 返回字段如
id
、title
、started_at
、last_message_at
和status
以显示对话列表。 - 允许在UI中提供排序或过滤选项(例如下拉菜单用于“最新”或文本输入用于标题搜索)。
- 返回字段如
示例工作流程
- 用户登录,前端获取其
user_id
(例如123
)。 - 用户在搜索栏中输入“给我最新的5个对话”。
- 前端向后端发送请求:
/api/conversations?user_id=123&query=latest 5
。 - 后端解析查询,生成SQL:
SELECT * FROM conversations WHERE user_id = 123 ORDER BY started_at DESC LIMIT 5;
- 后端以JSON格式返回结果,前端显示对话。
其他说明
- 如果
title
为可空,在第二个查询中添加AND title IS NOT NULL
以避免匹配空标题。 - 对于更复杂的查询(例如“关于java的上周对话”),合并条件:
SELECT * FROM conversations WHERE user_id = :authenticated_user_id AND title ILIKE '%java%' AND started_at >= CURRENT_TIMESTAMP - INTERVAL '7 DAYS';
- 如果需要更高级的自然语言解析器,请考虑集成AI模型(例如通过xAI的API使用Grok)将复杂查询映射到SQL。有关API详细信息,请访问xAI API。
请告诉我如果需要前端代码、后端API设置或其他查询示例的帮助!