Skip to content

🐛 fix(mcp): 按 schema 校验 PostgreSQL 表存在性 - #115

Merged
ZhaoXingPeng merged 1 commit into
mainfrom
fix/114-postgresql-table-exists-schema
Sep 7, 2026
Merged

🐛 fix(mcp): 按 schema 校验 PostgreSQL 表存在性#115
ZhaoXingPeng merged 1 commit into
mainfrom
fix/114-postgresql-table-exists-schema

Conversation

@ZhaoXingPeng

Copy link
Copy Markdown
Owner

关联 Issue

Closes #114

背景(Situation)

PostgreSQL 允许多个 schema 使用同一个表名。db_query_table_exists 原先只按数据库和表名查询,无法确认调用方需要的 tenant_a.users,与表列表、表描述和代码生成路径的 schema 契约不一致。

任务(Task)

为存在性检查增加可选 PostgreSQL schema,同时保持 MySQL、SQLite 现有行为和成功响应的 JSON 可解析性。

行动(Action)

  • 在 MCP 工具输入模型中声明可选 schema
  • PostgreSQL 查询在提供 schema 时追加参数绑定的 table_schema = %s 条件。
  • 成功 Raw Response 统一回显 schema,未提供时为 null
  • 增加工具契约、schema 参数绑定和 JSON 响应回归测试。

验证(Result)

  • PYTHONPATH=src python -m pytest -q tests/unit:658 passed。
  • python -m ruff check src tests:通过。
  • 变更文件 ruff format --check:通过。
  • git diff --check:通过。

实验与边界

使用 PostgreSQL stub 分别执行未提供 schema 与 tenant_a 两种输入:前者参数为 ("app", "users"),后者为 ("app", "users", "tenant_a"),schema 值始终通过参数传递,不进入 SQL 文本。未建立可比运行时性能基准,性能数据未测量,不作性能提升结论。MySQL 使用 database 作为 schema,SQLite 没有 schema 过滤,均保持原查询路径。

@ZhaoXingPeng

Copy link
Copy Markdown
Owner Author

问题复现:PostgreSQL 的 tenant_a.userstenant_b.users 可以同时存在,但 db_query_table_exists 原实现只绑定 ("app", "users"),调用方无法表达目标 schema,存在把错误对象判定为存在的风险。该缺口与已有 db_query_tablesdb_table_describe 的 schema 能力不一致。

@ZhaoXingPeng

Copy link
Copy Markdown
Owner Author

设计记录:输入 schema 定义为可选字段,仅在 PostgreSQL 分支追加 table_schema = %s。值始终使用驱动参数绑定,不拼接到 SQL;MySQL 继续把 database 作为 schema,SQLite 继续使用单命名空间,从而把新增能力限制在真实需要的方言范围内。

@ZhaoXingPeng

Copy link
Copy Markdown
Owner Author

实验结果:PostgreSQL stub 对未指定 schema 的调用收到 ("app", "users"),对 tenant_a 收到 ("app", "users", "tenant_a"),查询文本仅在第二种情况下出现 schema 条件。两种路径均返回可由 json.loads 解析的 Raw Response,并回显 schema 为字符串或 null

@ZhaoXingPeng

Copy link
Copy Markdown
Owner Author

验证记录:新增工具输入契约测试、schema 参数绑定测试和成功响应 JSON 测试;定向 MCP 测试 17 项通过,完整 PYTHONPATH=src python -m pytest -q tests/unit 为 658 passed,Ruff lint、变更文件格式检查与 git diff --check 全部通过。

@ZhaoXingPeng

Copy link
Copy Markdown
Owner Author

兼容性与边界:新增 schema 是成功响应的向后兼容字段扩展,旧客户端不传该字段仍走原查询。未建立真实 PostgreSQL 往返性能基准,性能数据未测量;本 PR 只修正对象定位,不宣称性能提升。后续若支持更多带命名空间的数据库,应复用同一输入契约并补充方言测试。

@ZhaoXingPeng
ZhaoXingPeng merged commit f885f57 into main Sep 7, 2026
10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

🐛 fix(mcp): 按 schema 校验 PostgreSQL 表存在性

1 participant