Claude 连接数据库:MCP 实现自然语言查询
让 Claude 连接数据库、用自然语言查询,核心是 MCP(Model Context Protocol,模型上下文协议)。你不需要写后端代码:在 Claude Desktop 或 Claude Code 的配置文件里声明一个数据库 MCP 服务器,Claude 就能自动发现数据库的表结构、把你的中文问题翻译成 SQL、执行并返回结果。下面用 PostgreSQL 走一遍完整流程,并给出只读隔离、自定义 Server 开发和排错方案。
MCP 让 Claude 查数据库的原理
MCP 是 Anthropic 提出的开放协议,它定义了 Claude 与外部工具/数据源之间的标准通信方式。数据库 MCP 服务器对外暴露两类能力:一是 resources(资源,比如把每张表的 schema 作为可读取的上下文),二是 tools(工具,比如一个 query 工具用于执行 SQL)。Claude 在对话中通过 Tool Use(工具调用)机制调用这些工具——模型决定调哪个工具、传什么 SQL,宿主程序执行后把结果回传给模型,模型再用中文总结给你。
如果你还不清楚 MCP 的整体定位,建议先读 MCP 是什么?一篇讲清 Claude 模型上下文协议,再回到这篇做实操。底层的 Tool Use 工作方式可参考 Claude Tool Use 工具调用怎么用?完整代码实战。
方式一:Claude Desktop 配置数据库 MCP(最快)
Claude Desktop 桌面版通过配置文件加载 MCP 服务器。社区与官方维护的 Postgres 连接器可以用 npx 直接拉起,无需本地安装。
- 打开配置文件。macOS 路径为
~/Library/Application Support/Claude/claude_desktop_config.json;Windows 为%APPDATA%\Claude\claude_desktop_config.json。文件不存在就新建。 - 写入
mcpServers配置,把连接串改成你自己的库:
{
"mcpServers": {
"postgres": {
"command": "npx",
"args": [
"-y",
"@modelcontextprotocol/server-postgres",
"postgresql://readonly_user:你的密码@localhost:5432/shop"
]
}
}
}
- 完全退出并重启 Claude Desktop(注意是退出进程,不是关窗口)。重启后在输入框工具图标里能看到
postgres服务器及其工具,说明连接成功。 - 直接提问:"shop 库里上个月销售额前 5 的商品是哪些?" Claude 会先读取表结构,再生成对应 SQL 并执行。
桌面版连接器的通用设置(包括内置连接器和故障排查)可对照 Claude MCP 怎么配置?桌面版连接器设置教程。
方式二:Claude Code 配置数据库 MCP(开发者首选)
如果你在终端里用 Claude Code(Anthropic 官方命令行工具)做开发,配置数据库 MCP 更顺手。用 claude mcp add 命令注册即可:
claude mcp add postgres \
-- npx -y @modelcontextprotocol/server-postgres \
"postgresql://readonly_user:密码@localhost:5432/shop"
添加后用 claude mcp list 查看状态,/mcp 斜杠命令可在会话中查看已连接的服务器和工具。完整的服务器管理步骤见 Claude Code 配置 MCP 服务器完整步骤;如果连不上,对照 Claude Code 报错不工作?常见问题排查清单。
关键安全实践:只读账号 + 权限隔离
让大模型直接生成并执行 SQL,最大的风险是误删误改。落地前务必做隔离:
- 建专用只读账号,而不是用
postgres超级用户。例如:CREATE USER readonly_user WITH PASSWORD '...';GRANT CONNECT ON DATABASE shop TO readonly_user;GRANT USAGE ON SCHEMA public TO readonly_user;GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly_user; - 不要授予 INSERT/UPDATE/DELETE/DROP。即使模型生成了写操作 SQL,数据库层也会直接拒绝。
- 连测试库或只读从库,避免直连生产主库。
- 密码不要硬编码进配置文件后随意分享,配置文件等同于明文凭据;可改用环境变量注入。
权限隔离应当作为默认动作,而非事后加固——这是把"自然语言查数据库"安全用起来的前提。
自己写一个数据库 MCP Server(Python)
现成连接器只支持基础查询,想加上字段脱敏、查询白名单、行数上限等业务逻辑,就需要自定义 MCP 服务器。下面用官方 mcp Python SDK 写一个最小可运行的只读 Postgres 服务器:
import asyncio
import psycopg2
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("postgres-readonly")
DSN = "dbname=shop user=readonly_user password=密码 host=localhost"
@mcp.tool()
def run_query(sql: str) -> str:
"""对 shop 库执行一条只读 SELECT 查询并返回结果。仅允许 SELECT。"""
if not sql.strip().lower().startswith("select"):
return "错误:仅允许 SELECT 查询。"
conn = psycopg2.connect(DSN)
try:
with conn.cursor() as cur:
cur.execute(sql)
rows = cur.fetchmany(200) # 限制返回行数,避免撑爆上下文
cols = [d[0] for d in cur.description]
lines = [" | ".join(cols)]
lines += [" | ".join(str(v) for v in r) for r in rows]
return "\n".join(lines)
finally:
conn.close()
@mcp.resource("schema://tables")
def list_schema() -> str:
"""把所有表结构作为上下文资源暴露给 Claude。"""
conn = psycopg2.connect(DSN)
try:
with conn.cursor() as cur:
cur.execute("""
SELECT table_name, column_name, data_type
FROM information_schema.columns
WHERE table_schema = 'public'
ORDER BY table_name, ordinal_position
""")
return "\n".join(f"{t}.{c} ({d})" for t, c, d in cur.fetchall())
finally:
conn.close()
if __name__ == "__main__":
mcp.run()
装好依赖(pip install "mcp[cli]" psycopg2-binary)后,在 Claude Desktop 配置里把 command 指向 python、args 指向脚本路径即可挂载。把 schema 作为 resource 暴露,能显著提升模型生成 SQL 的准确率——它不必猜表名和字段名。更系统的服务器开发流程参考 MCP Server 怎么搭建?Python 从零开发一个服务器。
选哪个模型?自然语言转 SQL 的实测建议
2026 年 Claude 主力模型为 Claude Opus 4.8、Claude Sonnet 4.6、Claude Haiku 4.5。结合数据库查询场景:
| 模型 | 适合场景 |
|---|---|
| Claude Opus 4.8 | 复杂多表 JOIN、窗口函数、需要推理业务含义的查询;准确率最高 |
| Claude Sonnet 4.6 | 日常查询的速度与质量平衡,大多数场景够用 |
| Claude Haiku 4.5 | 简单单表查询、高频低延迟需求 |
实测中提升准确率的几个写法:在提问时点明业务口径(如"销售额指 paid 状态订单的 amount 之和");让模型先解释它对表结构的理解再生成 SQL;遇到查不准时贴出真实的字段名。这些技巧本质上是减少模型幻觉,可结合 Claude 提示词怎么避免幻觉?实测有效的 5 个方法 一起用。模型选型的更多对比见 Claude 模型怎么选?Opus / Sonnet / Haiku 选型指南。
常见问题
配置后 Claude 看不到数据库工具怎么办?
最常见原因有三个:一是没有完全重启 Claude Desktop(要退出进程而非关窗口);二是 claude_desktop_config.json 有 JSON 语法错误(多了逗号、引号不闭合),可用 JSON 校验工具检查;三是连接串错误或数据库未启动。Claude Code 用户可用 claude mcp list 看到具体的连接失败原因。
让 Claude 执行 SQL 安全吗?会不会改坏数据?
关键在权限而非信任模型。只要用上文的只读账号连接,并且不授予写权限,即使模型生成了 INSERT/DELETE,数据库层也会拒绝执行。再叠加"连测试库/从库"和自定义 Server 里的 SELECT 白名单,风险可控。绝不要用超级用户直连生产库。
需要走 API 而不是桌面端,能让 Claude 调数据库吗?
可以。通过 Messages API(POST /v1/messages,鉴权头 x-api-key + anthropic-version)的 Tool Use 能力,你自己定义一个 run_query 工具:模型返回 tool_use 块时,由你的代码执行 SQL 并把结果作为 tool_result 回传。这相当于手写了 MCP 客户端的核心循环。具体代码见 Claude 函数调用示例:让模型调用你的 API 与 Claude API 怎么调用?从注册到第一次请求完整教程。涉及价格与限额请以 Anthropic 官网为准。