Schema 检索与文档生成
从 PostgreSQL 系统目录生成紧凑、可追踪的模型上下文
不要让模型自己探库
生产 Agent 不应拥有无边界的系统目录探索权。由受信任的构建任务提取 schema,脱敏、版本化后写入检索库;运行时只返回与任务相关的子图。
表和列
使用 information_schema 获取可移植的基础信息:
SELECT
c.table_schema,
c.table_name,
c.ordinal_position,
c.column_name,
c.data_type,
c.udt_name,
c.is_nullable,
c.column_default
FROM information_schema.columns AS c
WHERE c.table_schema = ANY($1::text[])
ORDER BY c.table_schema, c.table_name, c.ordinal_position;列注释来自 PostgreSQL 目录:
SELECT
n.nspname AS schema_name,
cls.relname AS table_name,
a.attname AS column_name,
col_description(cls.oid, a.attnum) AS comment
FROM pg_catalog.pg_attribute AS a
JOIN pg_catalog.pg_class AS cls ON cls.oid = a.attrelid
JOIN pg_catalog.pg_namespace AS n ON n.oid = cls.relnamespace
WHERE n.nspname = ANY($1::text[])
AND cls.relkind IN ('r', 'p')
AND a.attnum > 0
AND NOT a.attisdropped;外键边形成任务子图
SELECT
src_ns.nspname AS table_schema,
src.relname AS table_name,
src_col.attname AS column_name,
dst_ns.nspname AS foreign_table_schema,
dst.relname AS foreign_table_name,
dst_col.attname AS foreign_column_name
FROM pg_catalog.pg_constraint AS con
JOIN pg_catalog.pg_class AS src ON src.oid = con.conrelid
JOIN pg_catalog.pg_namespace AS src_ns ON src_ns.oid = src.relnamespace
JOIN pg_catalog.pg_class AS dst ON dst.oid = con.confrelid
JOIN pg_catalog.pg_namespace AS dst_ns ON dst_ns.oid = dst.relnamespace
CROSS JOIN LATERAL unnest(con.conkey, con.confkey)
AS key_columns(src_attnum, dst_attnum)
JOIN pg_catalog.pg_attribute AS src_col
ON src_col.attrelid = src.oid AND src_col.attnum = key_columns.src_attnum
JOIN pg_catalog.pg_attribute AS dst_col
ON dst_col.attrelid = dst.oid AND dst_col.attnum = key_columns.dst_attnum
WHERE con.contype = 'f'
AND src_ns.nspname = ANY($1::text[])
ORDER BY con.oid, src_col.attnum;conkey 与 confkey 按位置对应;并行 unnest 能正确保留复合外键的列映射。只按 constraint_name 连接 information_schema 视图,可能在复合外键上产生列的笛卡尔积。
文档构建流程
迁移合并
→ 临时数据库应用全部迁移
→ 目录提取
→ 规范化排序并移除环境值
→ 生成 JSON + Markdown 摘要
→ 计算 hash / 绑定迁移版本
→ 评审 schema diff
→ 发布到检索索引每张表的摘要只保留:用途、主键、外键、列类型与 nullable、约束、业务注释、敏感级别,以及最关键的查询索引。函数体、视图定义和策略仅在任务需要时展开。
防止陈旧
Agent 工具每次返回 contract_version。若运行时数据库的迁移版本与检索文档不一致,拒绝高风险请求并触发重建。不要静默使用旧契约。
Last updated on