PostgreSQL Field Guide

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;

conkeyconfkey 按位置对应;并行 unnest 能正确保留复合外键的列映射。只按 constraint_name 连接 information_schema 视图,可能在复合外键上产生列的笛卡尔积。

文档构建流程

迁移合并
 → 临时数据库应用全部迁移
 → 目录提取
 → 规范化排序并移除环境值
 → 生成 JSON + Markdown 摘要
 → 计算 hash / 绑定迁移版本
 → 评审 schema diff
 → 发布到检索索引

每张表的摘要只保留:用途、主键、外键、列类型与 nullable、约束、业务注释、敏感级别,以及最关键的查询索引。函数体、视图定义和策略仅在任务需要时展开。

防止陈旧

Agent 工具每次返回 contract_version。若运行时数据库的迁移版本与检索文档不一致,拒绝高风险请求并触发重建。不要静默使用旧契约。

Last updated on

On this page