mcpField
A
attach-db

attach-db

github.com/duckdb数据与数据库6131.1k 次安装28 周前更新
代码仓库

关于 attach-db

attach-db 是用于将数据库文件附加到 DuckDB 以供交互式查询的技能。它会验证数据库、检查表结构,并将附加设置写入共享项目状态文件。

主要功能

  1. 01解析并验证数据库路径
  2. 02列出表并收集结构与行数
  3. 03将附加设置追加到共享状态文件
  4. 04验证保存的状态文件

适用场景

  1. 01准备 DuckDB 数据库以供查询
  2. 02分析前检查表和行数

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/duckdb/duckdb-skills --skill attach-db

安装后在 Claude Code 中输入/attach-db确认已加载。

详细介绍

你正在帮助用户附加 DuckDB 数据库文件,以便进行交互式查询。

给定的数据库路径:$0

请按顺序执行以下步骤,遇到任何步骤失败时,请停止并清楚地报告。

状态文件约定:请参阅下方的“解析状态目录”部分。所有技能在每个项目中共用一个 state.sql 文件。解析完成后,任何技能都可以通过 duckdb -init "$STATE_DIR/state.sql" -c "<QUERY>" 使用该文件。

步骤 1 — 解析数据库路径

如果 $0 是相对路径,则相对于 $PWD 解析,以获取绝对路径(RESOLVED_PATH)。

RESOLVED_PATH="$(cd "$(dirname "$0")" 2>/dev/null && pwd)/$(basename "$0")"

检查文件是否存在:

test -f "$RESOLVED_PATH"
  • 文件存在 -> 继续执行步骤 2。
  • 未找到文件 -> 询问用户是否要创建新的空数据库(DuckDB 会在首次写入时创建文件)。如果是,则继续。如果否,则停止。

步骤 2 — 检查是否已安装 DuckDB

command -v duckdb

如果未找到,则委派给 /duckdb-skills:install-duckdb,然后继续。

步骤 3 — 验证数据库

duckdb "$RESOLVED_PATH" -c "PRAGMA version;"
  • 成功 -> 继续。
  • 失败 -> 清楚地报告错误(例如文件已损坏,或不是 DuckDB 数据库),然后停止。

步骤 4 — 探索架构

首先,列出所有表:

duckdb "$RESOLVED_PATH" -csv -c "
SELECT table_name, estimated_size
FROM duckdb_tables()
ORDER BY table_name;
"

如果数据库中没有表,请说明数据库为空,并跳到步骤 5。

对于发现的每个表(最多 20 个),运行:

duckdb "$RESOLVED_PATH" -csv -c "
DESCRIBE <table_name>;
SELECT count() AS row_count FROM <table_name>;
"

收集列定义和行数,用于生成摘要。

步骤 5 — 解析状态目录

检查以下任一位置是否已存在状态文件:

# Option 1: in the project directory
test -f .duckdb-skills/state.sql && STATE_DIR=".duckdb-skills"

# Option 2: in the home directory, scoped by project root path
PROJECT_ROOT="$(git rev-parse --show-toplevel 2>/dev/null || echo "$PWD")"
PROJECT_ID="$(echo "$PROJECT_ROOT" | tr '/' '-')"
test -f "$HOME/.duckdb-skills/$PROJECT_ID/state.sql" && STATE_DIR="$HOME/.duckdb-skills/$PROJECT_ID"

如果两个位置都不存在,请询问用户:

你想将此项目的 DuckDB 会话状态存储在哪里?

  1. 项目目录中(.duckdb-skills/state.sql)——与项目放在一起,便于查找。你可以选择将其添加到 gitignore。
  2. 主目录中(~/.duckdb-skills/<project-id>/state.sql)——保持项目目录整洁。

根据用户的选择:

选项 1:

STATE_DIR=".duckdb-skills"
mkdir -p "$STATE_DIR"

然后询问:“是否要将 .duckdb-skills/ 添加到 gitignore?”如果是:

echo '.duckdb-skills/' >> .gitignore

选项 2:

PROJECT_ROOT="$(git rev-parse --show-toplevel 2>/dev/null || echo "$PWD")"
PROJECT_ID="$(echo "$PROJECT_ROOT" | tr '/' '-')"
STATE_DIR="$HOME/.duckdb-skills/$PROJECT_ID"
mkdir -p "$STATE_DIR"

步骤 6 — 追加到状态文件

state.sql 是供所有 duckdb-skills 使用的共享累积初始化文件。它可能已包含其他技能写入的宏、LOAD 语句、机密信息或其他 ATTACH 语句。切勿覆盖该文件——请始终检查重复项,并以追加方式写入。

从文件名中去掉扩展名,生成数据库别名(例如,my_data.duckdb → my_data)。检查此 ATTACH 是否已存在:

grep -q "ATTACH.*RESOLVED_PATH" "$STATE_DIR/state.sql" 2>/dev/null

如果尚不存在,则追加:

cat >> "$STATE_DIR/state.sql" <<'STATESQL'
ATTACH IF NOT EXISTS 'RESOLVED_PATH' AS my_data;
USE my_data;
STATESQL

将 RESOLVED_PATH 和 my_data 替换为实际值。如果该别名与文件中现有别名冲突,请询问用户要使用什么名称。

步骤 7 — 验证状态文件是否可用

duckdb -init "$STATE_DIR/state.sql" -c "SHOW TABLES;"

如果失败,请修复状态文件并重试。

步骤 8 — 报告

向用户总结:

  • 数据库路径:解析后的绝对路径
  • 别名:状态文件中使用的数据库别名
  • 状态文件:解析后的 STATE_DIR/state.sql 路径
  • 表:每个表的名称、列数和行数(或说明数据库为空)
  • 确认数据库现已可用于 /duckdb-skills:query

如果数据库为空,建议创建表或导入数据。

评论

支持 Markdown