关于 attach-db
attach-db 是用于将数据库文件附加到 DuckDB 以供交互式查询的技能。它会验证数据库、检查表结构,并将附加设置写入共享项目状态文件。
主要功能
- 01解析并验证数据库路径
- 02列出表并收集结构与行数
- 03将附加设置追加到共享状态文件
- 04验证保存的状态文件
适用场景
- 01准备 DuckDB 数据库以供查询
- 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 会话状态存储在哪里?
- 项目目录中(
.duckdb-skills/state.sql)——与项目放在一起,便于查找。你可以选择将其添加到 gitignore。- 主目录中(
~/.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
如果数据库为空,建议创建表或导入数据。