使用AI构建SQL查询 | 原创,AI翻译

Home 2025.07

数据库模式 (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
);

说明:

该表设计灵活,可根据特定需求扩展,例如在单独的messages表中存储个别消息,或添加字段用于情感分析或对话标签。如果需要相关表(例如消息表)或与该表交互的查询,请告诉我!


为了实现一个前端,用户可以使用自然语言查询自己的对话(例如“给我最新的5个对话”或“标题包含java的对话”),需要确保SQL查询将结果限制在经过身份验证的用户的对话上。这涉及将用户身份(例如user_id)纳入查询,并将自然语言转换为SQL条件。以下是针对conversations表的提示和对应的SQL查询示例,确保用户只能访问自己的数据。

关键考虑

自然语言提示和SQL查询

提示1:”给我最新的5个对话”

解析要求

SQL查询

SELECT *
FROM conversations
WHERE user_id = :authenticated_user_id
ORDER BY started_at DESC
LIMIT 5;

提示2:”标题包含java的对话”

解析要求

SQL查询

SELECT *
FROM conversations
WHERE user_id = :authenticated_user_id
  AND title ILIKE '%java%';

前端实现说明

  1. 用户身份验证
    • 前端必须从JWT令牌或会话中获取用户的ID(例如123)。
    • 后端应验证user_id并在WHERE子句中使用它来过滤结果。
  2. 自然语言处理
    • 使用简单的基于规则的解析器或AI模型(如Grok)来解释自然语言查询并提取:
      • 意图:列出对话。
      • 过滤器:关键词(例如“java”),排序(例如“最新”),或限制(例如“5”)。
    • 例如,将“最新5”映射为ORDER BY started_at DESC LIMIT 5,将“标题包含java”映射为title ILIKE '%java%'
  3. API设计
    • 创建一个端点(例如/api/conversations),接受:
      • user_id:来自经过身份验证的会话。
      • query:自然语言输入或结构化参数(例如{ filter: "title contains java" })。
    • 后端将查询转换为SQL,确保user_id始终包含在WHERE子句中。
  4. 安全性
    • 绝对不要允许用户直接输入SQL或修改user_id过滤器。
    • 使用参数化查询(例如:authenticated_user_id)以防止SQL注入。
    • 验证输入以避免ILIKE搜索中的恶意模式。
  5. 前端显示
    • 返回字段如idtitlestarted_atlast_message_atstatus以显示对话列表。
    • 允许在UI中提供排序或过滤选项(例如下拉菜单用于“最新”或文本输入用于标题搜索)。

示例工作流程

  1. 用户登录,前端获取其user_id(例如123)。
  2. 用户在搜索栏中输入“给我最新的5个对话”。
  3. 前端向后端发送请求:/api/conversations?user_id=123&query=latest 5
  4. 后端解析查询,生成SQL:
    SELECT *
    FROM conversations
    WHERE user_id = 123
    ORDER BY started_at DESC
    LIMIT 5;
    
  5. 后端以JSON格式返回结果,前端显示对话。

其他说明

请告诉我如果需要前端代码、后端API设置或其他查询示例的帮助!


Back Donate