数据库
通过 Metabase 导出的 YAML…
当需要读取、编辑或理解由 @metabase/database-metadata 生成的 .metadata/databases YAML 元数据树,或借助它推理项目数据库 schema 时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
通过 Metabase 导出的 YAML特定
解决思路
- 把 .metadata/databases/ 下的 YAML 树作为权威数据源:读取这些文件来了解 schema、列、类型和外键关系。
- 永远不要打开、grep 或把 .metadata/table_metadata.json 传给工具——它是从 Metabase 导出的原始 JSON,可能达到数 MB 甚至数 GB,仅作为提取器的输入存在。
- 确认 .metadata/ 已被 gitignore:读取仓库的 .gitignore,若未列出则先询问用户再修改(元数据可能达 GB 级,提交会让仓库难以使用)。
- 仅在用户明确要求获取元数据、搭建工作流,或请求明显需要数据库 schema 知识时才触发首次设置,不要在会话开始时主动执行。
- 通过向 Metabase 实例调用 POST /api/ee/serialization/metadata/export 获取 table_metadata.json 并写入 .metadata/table_metadata.json;该端点接受 with-databases、with-tables、with-fields 三个布尔查询参数,默认均为 false,必须显式设置所需部分(典型完整导出三者都设为 true)。
- 使用用户提供的 base URL 和 API key(例如通过 METABASE_URL 和 METABASE_API_KEY 环境变量)执行导出,例如:mkdir -p .metadata && curl -sf -X POST "$METABASE_URL/api/ee/serialization/metadata/export?with-databases=true&with-tables=true&with-fields=true" -H "X-API-Key: $METABASE_API_KEY" -o .metadata/table_metadata.json;若用户未提供凭据,先询问再运行。
- 提取 YAML 树:先 rm -rf .metadata/databases,再运行 npx @metabase/database-metadata extract-table-metadata .metadata/table_metadata.json .metadata/databases,然后读取 .metadata/databases/ 下的 YAML 树来回答用户问题。
- 会话开始时不要运行任何抓取命令,只观察磁盘内容:若 .metadata/table_metadata.json 和 .metadata/databases/ 同时存在,就假定树足够新并直接使用,不要重新抓取;若树缺失或不完整,则等到用户提出需要它的请求时再进入首次设置流程。
- 使用过程中若发现树看起来过期或不一致,告知用户并让其决定是否重新抓取,绝不静默刷新。
- 仅在用户明确要求刷新元数据时,重新运行导出调用覆盖 .metadata/table_metadata.json,再重新运行提取步骤;重新提取前务必先删除 .metadata/databases,以免残留过期文件。
- 按实体类型定位文件:Database 位于 .metadata/databases/{db}/{db}.yaml;Table 位于 .metadata/databases/{db}/schemas/{schema}/tables/{table}.yaml(无 schema 的数据库为 .../tables/{table}.yaml),其 fields 数组内联包含所有列;Field 嵌套在 Table YAML 中,没有单独文件,包含 base_type、database_type,以及可选的 effective_type、semantic_type、coercion_strategy、parent_id、fk_target_field_id。
- 理解外键使用自然键元组而非数字 ID:Database 外键是数据库名字符串(如 "Sample Database");Table 外键是 [database, schema_or_null, table](如 ["Sample Database", "PUBLIC", "ORDERS"]);Field 外键是 [database, schema_or_null, table, field, ...nested_field_names](如 JSON 展开列 DATA.user.name 对应 ["Sample Database", "PUBLIC", "EVENTS", "DATA", "user", "name"]);字段级外键表现为 parent_id(嵌套字段父级)和 fk_target_field_id(外键列引用的主键)。
- 理解字段类型属性:database_type 是驱动返回的原生类型字符串(BIGINT、VARCHAR、JSONB 等,因数据库而异);base_type 是匹配原生类型的 Metabase 类型(type/BigInteger、type/Text、type/Structured 等);effective_type 是 Metabase 在查询时对待该列的类型,仅当与 base_type 不同(即配置了强制转换)时才输出;coercion_strategy 是从 base_type 产生 effective_type 的规则(如 Coercion/ISO8601->DateTime、Coercion/UNIXMilliSeconds->DateTime);semantic_type 是业务域标签(type/PK、type/FK、type/Email、type/Category、type/Latitude 等),驱动 UI 和部分分析行为。
- 按需阅读随技能附带的 spec.md,不要一上来就读:仅当需要 SKILL.md 摘要之外的细节(如完整的 base-type / semantic-type 层级、全部 coercion strategy 列表、精确的文件夹路径规则)时才打开;不要在会话开始时打开,也不要为与元数据树无关的任务打开。
- 若附带的 spec.md 看起来与上游包不同步,按技能自带 README.md 中记录的 extract-spec 方法刷新它。
适用边界 · 注意事项
- 用户未明确要求获取元数据、搭建工作流,或请求不需要数据库 schema 知识时,不要主动执行首次设置或抓取命令。
- 不要打开、grep 或把 .metadata/table_metadata.json 传给工具——它可能极大且仅作为提取器输入。
- 不要在用户未确认时修改 .gitignore,也不要静默刷新元数据树。