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で使用可能になったことを確認します。
データベースが空の場合は、テーブルの作成またはデータのインポートを提案します。