Windows开发者必备:2024年最新LangChain连接MySQL数据库教程
90
11 5 月, 2025
3 分钟阅读
0 阅读
Windows开发者必备:2024年最新LangChain连接MySQL数据库教程
引言
在AI应用开发中,LangChain已成为连接语言模型与外部数据的重要框架。本文将手把手教你如何在Windows环境下使用Python的LangChain库连接MySQL数据库,实现数据的智能查询和处理。
准备工作
环境要求
- Windows 10/11操作系统
- Python 3.8或更高版本
- MySQL Server 8.0+(本地或远程)
- 基本的Python编程知识
需要安装的包
代码片段
pip install langchain langchain-community pymysql python-dotenv
第一步:配置MySQL数据库
-
确保MySQL服务正在运行
代码片段# Windows服务管理命令 net start mysql
-
创建测试数据库和表
登录MySQL后执行:
代码片段
CREATE DATABASE langchain_demo;
USE langchain_demo;
CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
description TEXT,
price DECIMAL(10,2),
stock INT DEFAULT 0
);
INSERT INTO products (name, description, price, stock)
VALUES
('Laptop', 'High performance gaming laptop', 1299.99, 15),
('Smartphone', 'Latest model with AI camera', 899.50, 30),
('Headphones', 'Noise cancelling wireless', 249.99, 50);
## 第二步:设置环境变量
创建`.env`文件保护敏感信息:
# .env文件内容
MYSQL_HOST=localhost
MYSQL_PORT=3306
MYSQL_USER=your_username
MYSQL_PASSWORD=your_password
MYSQL_DATABASE=langchain_demo
> **安全提示**:永远不要将凭据直接硬编码在代码中,务必使用环境变量!
## 第三步:编写连接代码
# mysql_connector.py
from langchain_community.utilities import SQLDatabase
from dotenv import load_dotenv
import os
# 加载环境变量
load_dotenv()
def create_mysql_connection():
"""
创建MySQL数据库连接
返回:
SQLDatabase: LangChain的数据库连接对象
"""
# 从环境变量获取配置
db_config = {
'host': os.getenv('MYSQL_HOST'),
'port': os.getenv('MYSQL_PORT'),
'user': os.getenv('MYSQL_USER'),
'password': os.getenv('MYSQL_PASSWORD'),
'database': os.getenv('MYSQL_DATABASE')
}
# MySQL连接URI格式: mysql+pymysql://user:password@host:port/database
db_uri = f"mysql+pymysql://{db_config['user']}:{db_config['password']}@{db_config['host']}:{db_config['port']}/{db_config['database']}"
# 创建LangChain SQLDatabase实例
db = SQLDatabase.from_uri(db_uri)
return db
if __name__ == "__main__":
db = create_mysql_connection()
# 测试查询 - 获取所有产品名称和价格(前5条)
query = "SELECT name, price FROM products LIMIT 5;"
try:
result = db.run(query)
print("查询结果:")
print(result)
# 获取数据库结构信息(表名)
print("\n数据库中的表:")
print(db.get_table_names())
# 获取products表的DDL(数据定义语言)
print("\nproducts表结构:")
print(db.get_table_info(table_names=["products"]))
except Exception as e:
print(f"查询出错: {e}")
## 第四步:整合LangChain进行智能查询
# llm_query.py
from langchain.chains import create_sql_query_chain
from langchain_openai import ChatOpenAI
from mysql_connector import create_mysql_connection
def setup_query_chain():
"""
设置SQL查询链
返回:
配置好的SQL查询链实例和数据库连接对象元组 (chain, db)
"""
# OpenAI模型初始化(需要自己的API KEY)
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
# MySQL连接初始化(使用上一步创建的模块)
db = create_mysql_connection()
# SQL查询链创建 - LangChain会自动生成SQL语句并执行它!
chain = create_sql_query_chain(llm, db)
return chain, db
def execute_natural_language_query(question):
"""
执行自然语言查询
参数:
question (str): 自然语言问题
返回:
查询结果和生成的SQL语句元组 (result, generated_sql)
"""
chain, db = setup_query_chain()
try:
# LLM生成SQL查询语句(不执行)
generated_sql = chain.invoke({"question": question})
print(f"\n生成的SQL:\n{generated_sql}")
# 手动执行生成的SQL以确保安全(生产环境中建议添加验证步骤)
result = db.run(generated_sql)
return result, generated_sql
except Exception as e:
print(f"查询出错: {e}")
return None, None
if __name__ == "__main__":
questions = [
"有哪些产品库存少于20个?",
"列出价格超过1000美元的产品",
"显示所有产品的平均价格"
]
for question in questions:
print(f"\n问题: {question}")
result, sql = execute_natural_language_query(question)
if result:
print("\n结果:")
print(result)
## 关键点解析
1. **连接URI格式**:
- `mysql+pymysql://`指定使用PyMySQL驱动连接MySQL
- `user:password@host:port/database`是标准的认证信息格式
2. **SQLDatabase类**:
- LangChain提供的统一数据库接口
- `run()`方法执行原始SQL
- `get_table_info()`获取表结构对LLM生成准确SQL至关重要
3. **安全考虑**:
- LLM生成的SQL应经过验证再执行
- MySQL用户应仅具有必要权限
## Windows特有注意事项
1. **防火墙设置**:
```powershell
# Windows防火墙允许MySQL端口(3306默认端口)
New-NetFirewallRule -DisplayName "MySQL Server" -Direction Inbound -LocalPort 3306 -Protocol TCP -Action Allow
-
ODBC驱动问题:
- Windows可能需要安装MySQL Connector/ODBC
-
服务启动问题:
代码片段:: MySQL服务启动失败时尝试重新初始化 mysqld --initialize --console net start mysql
常见问题解决
- 编码问题:
代码片段
# MySQL URI中添加charset参数解决中文乱码
db_uri += "?charset=utf8mb4"
- SSL错误:
代码片段
# MySQL URI中添加SSL禁用参数(仅开发环境)
db_uri += "?ssl_disabled=True"
- 连接超时:
代码片段
# MySQL URI中添加超时参数(秒)
db_uri += "?connect_timeout=10"
API进阶用法示例
代码片段
# advanced_features.py
from sqlalchemy import text
def get_product_details(db):
"""演示高级功能:参数化查询和事务"""
with db._engine.connect() as connection:
with connection.begin(): #事务开始
params = {"min_price":500,"max_stock":40}
query=text("""SELECT*FROM products WHERE price>:min_price AND stock<:max_stock""")
result=connection.execute(query,params).fetchall()
return result
if __name__=="__main__":
db=create_mysql_connection()
print(get_product_details(db))
总结
通过本教程,你已经学会了:
- Windows环境下配置LangChain与MySQL的连接
- Python中使用环境变量保护敏感信息
- LangChain自动生成并执行SQL查询的能力
- Windows特有的配置问题和解决方案
下一步可以探索:
– [ ] LangChain的Agent功能实现更复杂的数据库操作
– [ ] MySQL视图与LangChain的结合使用
– [ ] Windows性能优化技巧
完整代码已上传至GitHub:[示例仓库链接]