【Langchain】SQL查询链构建
·
目录

作用概括
这段代码基于 LangChain 框架,实现了用自然语言查询 MySQL 数据库的功能。用户只需输入中文问题,LangChain 会自动将其转为 SQL 查询,并返回结果。
一、创建数据库
选用数据库:Navicat for MySQL
1.1 创建连接


1.2 新建数据库


1.3 创建表

创建命令:
CREATE TABLE students (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
age INT
);
1.4 查看创建表

1.5 执行代码
from langchain_community.utilities import SQLDatabase
# 连接 sqlite 数据库
# db = SQLDatabase.from_uri("sqlite:///demo.db")
# 连接 MySQL 数据库
db_user = "root"
db_password = "123456"
db_host = "127.0.0.1"
db_port = "3306"
db_name = "llm"
db = SQLDatabase.from_uri(
f"mysql+pymysql://{db_user}:
{db_password}@{db_host}:
{db_port}/{db_name}"
)
print("那种数据库:",db.dialect)
print("获取数据表:",db.get_usable_table_names())
# 执行查询
res = db.run("SELECT count(*) FROM students;")
print("查询结果:",res)
运行结果
那种数据库: mysql 获取数据表: ['students'] 查询结果: [(0,)]
二、构建SQL模拟数据
2.1 数据结构(表设计)



1. students 表(学生信息表)
CREATE TABLE students (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50),
class_name VARCHAR(50)
);
2. scores 表(成绩表)
CREATE TABLE scores (
id INT AUTO_INCREMENT PRIMARY KEY,
student_id INT,
subject VARCHAR(50),
score FLOAT,
FOREIGN KEY (student_id) REFERENCES students(id)
);
2.2 插入一些示例数据



执行代码
-- 插入学生
INSERT INTO students (name, class_name) VALUES
('张三', '一班'),
('李四', '一班'),
('王五', '二班');
-- 插入成绩
INSERT INTO scores (student_id, subject, score) VALUES
(1, '数学', 88.5),
(2, '数学', 92.0),
(3, '数学', 75.0),
(1, '语文', 80.0),
(2, '语文', 85.5),
(3, '语文', 78.0);
2.3 构建查询SQL数据执行代码
from dotenv import load_dotenv
load_dotenv()
from langchain_community.utilities import SQLDatabase
# 连接 sqlite 数据库
# db = SQLDatabase.from_uri("sqlite:///demo.db")
# 连接 MySQL 数据库
db_user = "root"
db_password = "123456"
db_host = "127.0.0.1"
db_port = "3306"
db_name = "llm"
db = SQLDatabase.from_uri(f"mysql+pymysql://{db_user}:{db_password}@{db_host}:{db_port}/{db_name}")
from langchain_openai import ChatOpenAI
from langchain.chains import create_sql_query_chain
# 初始化大模型
llm = ChatOpenAI(model="gpt-4", temperature=0)
chain = create_sql_query_chain(llm=llm, db=db)
#response = chain.invoke({"question": "查询考试科目一共有多少?"})
response = chain.invoke({"question": "查询一班的学生数学成绩是多少?"})
# 限制使用的表
# response = chain.invoke({"question": "一共有多少个学生?", "table_names_to_use": ["students"]})
print(response)
运行结果
```sql SELECT `students`.`name`, `scores`.`score` FROM `scores` JOIN `students` ON `scores`.`student_id` = `students`.`id` WHERE `students`.`class_name` = '一班' AND `scores`.`subject` = '数学' LIMIT 5; ```
复制该结果到sql的命令窗口执行
2.4 复制查询

三、模块功能说明
-
加载环境变量
from dotenv import load_dotenv load_dotenv()✅ 加载
.env文件中的环境变量(如 API 密钥)。 -
连接 MySQL 数据库
from langchain_community.utilities import SQLDatabase db = SQLDatabase.from_uri("mysql+pymysql://root:123456@127.0.0.1:3306/llm")✅ 使用 LangChain 的
SQLDatabase工具连接本地 MySQL 数据库llm。 -
初始化语言模型
from langchain_openai import ChatOpenAI llm = ChatOpenAI(model="gpt-4", temperature=0)✅ 使用 OpenAI 的 GPT-4 模型,用于生成 SQL 语句。
-
创建 SQL 查询链
from langchain.chains import create_sql_query_chain chain = create_sql_query_chain(llm=llm, db=db)✅ 将大模型与数据库绑定,创建自然语言到 SQL 的转化链。
-
执行自然语言查询
response = chain.invoke({"question": "查询一班的学生数学成绩是多少?"}) print(response)✅ 输入中文问题,让模型自动生成 SQL 语句并执行,返回结果。
四、你可以查询的内容示例
-
一班的数学成绩 -
学生总数 -
张三的语文成绩 -
所有班级的平均分
五、总结一句话
📊「这段代码通过 LangChain + OpenAI 实现了一个智能数据库问答系统,用户输入中文问题,模型自动翻译成 SQL 并执行查询。」
更多推荐

所有评论(0)