langchain支持三种数据库查询方式:一、用sqldatabasechain实现自然语言转sql查询;二、用sqldatabasetoolkit配合agent动态多步查询;三、自定义databasequerytool实现细粒度安全控制。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

如果您希望在LangChain应用中执行数据库查询操作,则需要通过适配器与数据库建立连接,并将查询结果注入到语言模型的上下文中。以下是实现LangChain连接数据库并完成数据查询的具体步骤:
一、使用SQLDatabaseChain连接关系型数据库
SQLDatabaseChain是LangChain提供的内置链,专用于连接SQL数据库并执行自然语言查询。它依赖SQLAlchemy作为底层驱动,支持PostgreSQL、MySQL、SQLite等主流关系型数据库。该方法无需手动编写SQL语句,模型可直接理解用户提问并生成对应查询。
1、安装必要依赖:pip install langchain sqlalchemy psycopg2-binary
2、导入模块并初始化数据库连接:from langchain.utilities import SQLDatabase;db = SQLDatabase.from_uri("postgresql+psycopg2://user:password@localhost:5432/mydb")
3、加载大语言模型并构建SQLDatabaseChain:from langchain.llms import OpenAI;from langchain.chains import SQLDatabaseChain;llm = OpenAI(temperature=0);chain = SQLDatabaseChain(llm=llm, database=db, verbose=True)
4、调用chain.run()执行自然语言查询:chain.run("查询用户表中年龄大于30的所有姓名")
二、通过SQLDatabaseToolkit配合Agent动态查询
SQLDatabaseToolkit结合Agent可实现更灵活的交互式数据库查询,支持多步推理、错误修正与元数据感知。它会自动加载表结构信息,并在执行前验证SQL语法合法性,适合复杂业务场景下的探索式查询。
1、创建SQLDatabase实例并传入schema信息:db = SQLDatabase.from_uri("sqlite:///example.db", include_tables=["users", "orders"])
2、初始化工具集:from langchain.agents import create_sql_agent;from langchain.agents.agent_toolkits import SQLDatabaseToolkit;toolkit = SQLDatabaseToolkit(db=db, llm=llm)
3、构建Agent:agent_executor = create_sql_agent(llm=llm, toolkit=toolkit, verbose=True, agent_type="openai-tools")
4、发起查询请求:agent_executor.invoke({"input": "统计每个城市的订单总数"})
三、自定义DatabaseQueryTool实现细粒度控制
当内置链无法满足权限隔离、查询限流或审计日志等企业级需求时,可通过继承BaseTool类定义专用查询工具。该方式完全掌控输入解析、SQL生成、执行与结果格式化全过程,适用于高安全要求环境。
1、定义工具类并重写_run方法:class DatabaseQueryTool(BaseTool): name = "db_query";description = "Useful for querying database with custom SQL"
2、在_run中嵌入参数校验与白名单机制:if not re.match(r'^SELECT\s.+FROM\s\w+', query): raise ValueError("Only SELECT statements allowed")
3、使用execute()执行预编译语句并返回结构化结果:result = db.engine.execute(text(query)).fetchall()
4、将工具注册至Agent工具列表:tools = [DatabaseQueryTool(db=db)];agent = initialize_agent(tools, llm, agent="chat-zero-shot-react-description", verbose=True)










