Windows开发者必备:2024年最新LangChain连接MySQL数据库教程

云信安装大师
90
AI 质量分
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数据库

  1. 确保MySQL服务正在运行

    代码片段
    # Windows服务管理命令
    net start mysql
    
  2. 创建测试数据库和表
    登录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 
  1. ODBC驱动问题

  2. 服务启动问题

    代码片段
    :: MySQL服务启动失败时尝试重新初始化 
    mysqld --initialize --console 
    net start mysql 
    

常见问题解决

  1. 编码问题
代码片段
# MySQL URI中添加charset参数解决中文乱码 
db_uri += "?charset=utf8mb4"
  1. SSL错误
代码片段
# MySQL URI中添加SSL禁用参数(仅开发环境) 
db_uri += "?ssl_disabled=True"
  1. 连接超时
代码片段
# 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)) 

总结

通过本教程,你已经学会了:

  1. Windows环境下配置LangChain与MySQL的连接
  2. Python中使用环境变量保护敏感信息
  3. LangChain自动生成并执行SQL查询的能力
  4. Windows特有的配置问题和解决方案

下一步可以探索:
– [ ] LangChain的Agent功能实现更复杂的数据库操作
– [ ] MySQL视图与LangChain的结合使用
– [ ] Windows性能优化技巧

完整代码已上传至GitHub:[示例仓库链接]

原创 高质量