database について
Golden Armada AI Agent Fleet Platform のデータベース作業向けスキルです。PostgreSQL のスキーマ設計、SQL クエリ、マイグレーション、最適化に加え、SQLAlchemy ORM の例を扱います。
主な機能
- 01PostgreSQL スキーマ設計
- 02SQL クエリと結合
- 03マイグレーションとロールバック
- 04インデックスとクエリの最適化
- 05SQLAlchemy ORM の例
- 06データベースのベストプラクティス
活用シーン
- 01agents と tasks のスキーマ設計
- 02PostgreSQL クエリの作成と最適化
- 03マイグレーションの作成とロールバック
- 04遅いクエリとインデックス利用の調査
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ thelobbi/ claude --skill databaseインストール後、Claude Code で/databaseを入力して読み込まれたか確認します。
詳細
データベーススキル
Golden Armada AI Agent Fleet Platform の包括的なデータベース機能を提供します。
このスキルを使用するタイミング
次の作業を行う際に、このスキルを有効にします。
- データベーススキーマの設計
- SQL クエリの作成と最適化
- データベースのマイグレーション
- インデックスの最適化
- データモデリング
PostgreSQL クイックリファレンス
接続
# 接続
psql -h localhost -U postgres -d golden_armada
# 接続文字列
postgresql://user:password@host:5432/database
# よく使う psql コマンド
\l # データベースの一覧表示
\c database_name # データベースに接続
\dt # テーブルの一覧表示
\d table_name # テーブルの詳細表示
\di # インデックスの一覧表示
\q # 終了
スキーマ設計
-- 一般的なパターンを使用してテーブルを作成
CREATE TABLE agents (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name VARCHAR(100) NOT NULL,
type VARCHAR(50) NOT NULL CHECK (type IN ('claude', 'gpt', 'gemini')),
status VARCHAR(20) DEFAULT 'idle',
config JSONB DEFAULT '{}',
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW(),
deleted_at TIMESTAMPTZ -- 論理削除
);
-- インデックスを作成
CREATE INDEX idx_agents_type ON agents(type);
CREATE INDEX idx_agents_status ON agents(status) WHERE deleted_at IS NULL;
CREATE INDEX idx_agents_config ON agents USING GIN(config);
-- 外部キーを追加
CREATE TABLE tasks (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
agent_id UUID NOT NULL REFERENCES agents(id) ON DELETE CASCADE,
message TEXT NOT NULL,
result TEXT,
status VARCHAR(20) DEFAULT 'pending',
created_at TIMESTAMPTZ DEFAULT NOW()
);
よく使うクエリ
-- 基本的な CRUD
INSERT INTO agents (name, type) VALUES ('agent-1', 'claude') RETURNING *;
SELECT * FROM agents WHERE type = 'claude' AND deleted_at IS NULL;
UPDATE agents SET status = 'active' WHERE id = $1 RETURNING *;
DELETE FROM agents WHERE id = $1;
-- 結合
SELECT a.name, COUNT(t.id) as task_count
FROM agents a
LEFT JOIN tasks t ON a.id = t.agent_id
WHERE a.deleted_at IS NULL
GROUP BY a.id;
-- JSON 操作
SELECT * FROM agents WHERE config->>'model' = 'claude-sonnet-5';
SELECT * FROM agents WHERE config @> '{"enabled": true}';
UPDATE agents SET config = config || '{"version": "2.0"}' WHERE id = $1;
-- ウィンドウ関数
SELECT
name,
created_at,
ROW_NUMBER() OVER (ORDER BY created_at) as row_num,
LAG(created_at) OVER (ORDER BY created_at) as prev_created
FROM agents;
-- CTE
WITH active_agents AS (
SELECT * FROM agents WHERE status = 'active'
)
SELECT * FROM active_agents WHERE type = 'claude';
マイグレーション
-- マイグレーション: 001_create_agents.sql
BEGIN;
CREATE TABLE agents (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name VARCHAR(100) NOT NULL,
type VARCHAR(50) NOT NULL,
created_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE INDEX idx_agents_type ON agents(type);
COMMIT;
-- ロールバック: 001_create_agents.sql
BEGIN;
DROP TABLE IF EXISTS agents;
COMMIT;
パフォーマンスの最適化
-- クエリプランを分析
EXPLAIN ANALYZE SELECT * FROM agents WHERE type = 'claude';
-- インデックスの使用状況を確認
SELECT
schemaname,
tablename,
indexname,
idx_scan,
idx_tup_read
FROM pg_stat_user_indexes;
-- 実行速度の遅いクエリを検索
SELECT
query,
calls,
mean_time,
total_time
FROM pg_stat_statements
ORDER BY mean_time DESC
LIMIT 10;
-- VACUUM と ANALYZE を実行
VACUUM ANALYZE agents;
SQLAlchemy ORM
```python from sqlalchemy import Column, String, DateTime, ForeignKey, JSON from sqlalchemy.dialects.postgresql import UUID from sqlalchemy.orm import relationship from sqlalchemy.sql import func import uuid
class Agent(Base): tablename = 'agents'
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
name = Column(String(100), nullable=False)
type = Column(String(50), nullable=False)
status = Column(String(20), default='idle')
config = Column(JSON, default={})
created_at = Column(DateTime(timezone=True), server_default=func.now())
updated_at = Column(DateTime(timezone=True), onupdate=func.now())
tasks = relationship("Task", back_populates="agent", cascade="all, delete-orphan")
class Task(Base): tablename = 'tasks'
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
agent_id = Column(UUID(as_uuid=True), ForeignKey('agents.id'), nullable=False)
message = Column(String, nullable=False)
result = Column(String)
agent = relationship("Agent", back_populates="tasks")
```
ベストプラクティス
- 分散システムでは主キーにUUIDを使用する
- 頻繁にクエリされるカラムにはインデックスを追加する
- 重要なデータにはソフトデリート(
deleted_at)を使用する - 柔軟なデータにはJSONBを使用し、GINインデックスを設定する
- データの整合性を保つために外部キー制約を使用する
- 監査のために作成日時と更新日時を記録する
- パフォーマンス向上のためにコネクションプーリングを使用する
コメント
Markdown 対応