Cursor + MCP 让 AI 直接操作数据库:从零到生产
适用场景
- 开发时频繁需要查表结构、跑 SQL 验证
- AI 生成代码时需要知道数据库 schema
- 想让 AI 帮写数据库迁移文件
为什么用 MCP 而不是复制粘贴
传统做法:手动跑 \d table_name → 复制结果 → 粘给 Cursor → AI 生成 SQL → 手动执行验证。
MCP 做法:Cursor 直接连数据库 → AI 自己查 schema → 生成 SQL → 自己执行验证 → 返回结果。
省的是中间的复制粘贴往返。在复杂查询调试时,这个往返可能 5-10 次。
第一步:装 MCP PostgreSQL Server
用 Smithery 一行装好:
npx @smithery/cli install @modelcontextprotocol/server-postgres --client cursor
或手动配 Cursor Settings → MCP → Add Server:
{
"mcpServers": {
"postgres": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-postgres"],
"env": {
"DATABASE_URL": "postgresql://user:pass@localhost:5432/mydb"
}
}
}
}
重启 Cursor,Agent 模式现在能查数据库了。
第二步:安全配置(重要)
用只读账号
绝对不要用超级用户账号连 MCP。 创建只读账号:
CREATE ROLE mcp_readonly WITH LOGIN PASSWORD 'xxx';
GRANT USAGE ON SCHEMA public TO mcp_readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO mcp_readonly;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO mcp_readonly;
开发/生产隔离
{
"mcpServers": {
"postgres-dev": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-postgres"],
"env": {
"DATABASE_URL": "postgresql://mcp_readonly:xxx@localhost:5432/mydb_dev"
}
}
}
}
只在 dev 环境配 MCP。生产数据库永远不连 MCP。
限制可查的表
如果有些表(用户密码、token)不想让 AI 看到,用视图:
CREATE VIEW public_safe.users_safe AS
SELECT id, username, created_at FROM public.users;
REVOKE SELECT ON public.users FROM mcp_readonly;
GRANT SELECT ON public_safe.users_safe TO mcp_readonly;
第三步:实战用法
场景一:查 schema 生成代码
在 Cursor Agent 模式输入:
帮我写一个查询用户订单的 API,需要分页
Cursor 会:
- 调 MCP
list_tables看有哪些表 - 调 MCP
describe_table看 orders 和 users 表结构 - 生成 JOIN 查询 + 分页代码
场景二:调试 SQL
这个查询很慢,帮我优化
SELECT * FROM orders o JOIN users u ON o.user_id = u.id WHERE o.status = 'pending'
Cursor 会:
- 跑
EXPLAIN ANALYZE看执行计划 - 发现全表扫描
- 建议加索引
- 生成 migration 文件
场景三:生成迁移
给 orders 表加一个 shipping_address 字段,类型 jsonb,可空
Cursor 会:
- 查当前 orders 表结构
- 生成
ALTER TABLESQL - 生成 Drizzle/Prisma migration 文件
- 生成回滚 SQL
权限边界
| 操作 | 只读 MCP | 可写 MCP |
|---|---|---|
| 查表结构 | ✅ | ✅ |
| SELECT 查询 | ✅ | ✅ |
| EXPLAIN | ✅ | ✅ |
| INSERT/UPDATE/DELETE | ❌ | ✅ |
| CREATE/DROP TABLE | ❌ | ⚠️ 需额外授权 |
| ALTER TABLE | ❌ | ⚠️ 需额外授权 |
建议:日常用只读 MCP,需要写操作时切到可写 MCP 并加确认步骤。
踩坑记录
- MCP Server 连接池:默认无连接池,大量查询会打满 PG 连接。用 PgBouncer 做连接池。
- 大表 SELECT:AI 可能跑
SELECT * FROM huge_table。设statement_timeout防止卡死:ALTER ROLE mcp_readonly SET statement_timeout = '10s'; - Cursor MCP 不支持事务:每个 SQL 是独立执行,不能 BEGIN/COMMIT。多步操作用存储过程。
- DATABASE_URL 泄露:
.cursor/mcp.json可能被 git 提交。加到.gitignore,用.cursor/mcp.local.json。