You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Schema文件创建SQLDatabase?能否替代SQLDatabaseChain?

关于SQLDatabaseChain与Schema处理的问题解答

1. 能否通过Schema文件创建SQLDatabase,无需实际数据库连接?

可以。LangChain的SQLDatabase支持仅通过表结构元数据初始化,不需要连接真实数据库。你可以从SQL DDL文件、JSON格式的Schema文件解析内容,或者手动构造表结构信息传入。

举个从DDL字符串创建的示例:

from langchain.sql_database import SQLDatabase

# 从DDL语句初始化,指定数据库方言
ddl_content = """
CREATE TABLE users (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    email VARCHAR(100) UNIQUE
);
CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    user_id INT,
    order_date DATE,
    total_amount DECIMAL(10,2),
    FOREIGN KEY (user_id) REFERENCES users(id)
);
"""
db = SQLDatabase.from_string(ddl_content, dialect="postgresql")

这种方式下,SQLDatabase只会基于你提供的Schema生成SQL,不会执行任何实际数据库操作,完全符合你只生成SQL不执行查询的需求。

2. 是否可不使用SQLDatabaseChain,通过其他方式将Schema提供给LLM处理?

当然可以。你可以直接将Schema整理成结构化文本,作为prompt的一部分喂给LLM,或者用系统消息传递给Chat模型,让它基于Schema生成SQL。

方法一:构造包含Schema的Prompt模板

把表结构、字段类型、关联关系整理成清晰的文本,嵌入到prompt中:

from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate

llm = OpenAI(temperature=0)

# 整理后的Schema信息
schema_details = """
数据库表结构:
- users表:
  id(INT,主键)、name(VARCHAR(50))、email(VARCHAR(100),唯一)
- orders表:
  order_id(INT,主键)、user_id(INT,外键关联users.id)、order_date(DATE)、total_amount(DECIMAL(10,2))
"""

# 定义Prompt模板
sql_gen_prompt = PromptTemplate(
    input_variables=["user_query"],
    template="""基于以下数据库Schema生成对应的SQL语句,不要执行查询:
{schema_details}
用户需求:{user_query}
生成的SQL:"""
)

# 生成SQL
prompt = sql_gen_prompt.format(schema_details=schema_details, user_query="查询所有用户的订单总金额")
sql_result = llm(prompt)
print(sql_result)

方法二:用Chat模型的系统消息传递Schema

如果使用Chat类模型(如GPT-3.5/4),可以将Schema作为系统消息传入,让模型更精准地理解数据库结构:

from langchain.chat_models import ChatOpenAI
from langchain.schema import SystemMessage, HumanMessage

chat_model = ChatOpenAI(temperature=0)

system_message = SystemMessage(content=f"你是SQL生成专家,仅基于以下数据库Schema生成SQL语句,不执行查询:{schema_details}")
user_message = HumanMessage(content="统计2023年每个用户的订单数量")

response = chat_model([system_message, user_message])
print(response.content)

内容的提问来源于stack exchange,提问作者eLAN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 15:20:23