mcpField
B
blink-database

blink-database

github.com/blink-newデータ・データベース441 回インストール2 週間前に更新
リポジトリ

blink-database について

blink-databaseは、Blinkのデータベースクエリ、スキーマ、SDKによるCRUD操作を扱うスキルです。SQL、絞り込みや一括操作に加え、SQLiteの真偽値とJWTで保護されたユーザー単位のアクセスも説明します。

主な機能

  1. 01SQLクエリの実行
  2. 02データベーススキーマの確認
  3. 03SDKによるCRUDと一括操作
  4. 04レコードの絞り込みと並べ替え
  5. 05SQLiteの真偽値への対応
  6. 06JWT保護とRLSの利用

活用シーン

  1. 01テーブルの作成と確認
  2. 02アプリのレコードの検索や更新
  3. 03データベース変更の一括処理
  4. 04ユーザー単位のデータアクセス設定

MCP 対応

SQLクエリ用の`blink_db_query`とデータベーススキーマ取得用の`blink_db_schema`という2つのMCPツールが記載されています。

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/blink-new/blink-plugin --skill blink-database

インストール後、Claude Code で/blink-databaseを入力して読み込まれたか確認します。

詳細

MCP ツール

blink_db_query · blink_db_schema

  • blink_db_query — 任意の SQL クエリ(SELECT、INSERT、UPDATE、DELETE、CREATE TABLE など)を実行します
  • blink_db_schema — スキーマ全体を取得します。すべてのテーブルについて、カラム名、型、NULL 許容性、デフォルト値、主キーを確認できます

はじめに

# Create a table
blink db query "CREATE TABLE todos (id TEXT PRIMARY KEY, title TEXT NOT NULL, user_id TEXT, is_completed INTEGER DEFAULT 0, created_at TEXT DEFAULT (datetime('now')))"

# Inspect schema
blink db query "SELECT name FROM sqlite_master WHERE type='table'"

# Run any SQL
blink db query "SELECT * FROM todos LIMIT 10"

自動ケース変換

SDK は camelCase と snake_case を自動的に相互変換します。コードでは常に camelCase を使用してください。

// ✅ Correct
await blink.db.emailDrafts.create({ userId: user.id, createdAt: new Date() })

// ❌ Wrong — never use snake_case in SDK calls
await blink.db.email_drafts.create({ user_id: user.id })

CRUD 操作

// Create (ID auto-generates as string)
const todo = await blink.db.todos.create({ title: 'Learn Blink', userId: user.id, isCompleted: false })

// Get by ID
const todo = await blink.db.todos.get('todo_12345')

// List with filtering
const todos = await blink.db.todos.list({
  where: { AND: [{ userId: user.id }, { OR: [{ status: 'open' }, { priority: 'high' }] }] },
  orderBy: { createdAt: 'desc' },
  limit: 20,
  offset: 0,
})

// Update
await blink.db.todos.update('todo_12345', { isCompleted: true })

// Delete
await blink.db.todos.delete('todo_12345')

// Upsert
await blink.db.todos.upsert({ id: 'todo_12345', title: 'Updated', userId: user.id })

// Count / Exists
const count = await blink.db.todos.count({ where: { userId: user.id } })
const exists = await blink.db.todos.exists({ where: { id: 'todo_12345' } })
一括操作
await blink.db.todos.createMany([{ title: 'Task 1', userId: user.id }, { title: 'Task 2', userId: user.id }])
await blink.db.todos.updateMany([{ id: 'todo_1', isCompleted: true }, { id: 'todo_2', isCompleted: true }])
await blink.db.todos.deleteMany({ where: { userId: user.id, isCompleted: "1" } })

ブール値の処理(重要)

SQLite はブール値を true/false ではなく、"0"/"1" の文字列として返します。

// ✅ Correct
const completed = todos.filter(todo => Number(todo.isCompleted) > 0)

// Filter in queries
const done = await blink.db.todos.list({ where: { isCompleted: "1" } })

TypeScript

interface Todo {
  id: string        // MUST be string, never number
  title: string
  isCompleted: boolean  // Returned as "0"/"1" from SQLite
  userId: string
  createdAt: string
}

// Typed queries
const todos = await blink.db.table<Todo>('todos').list()

フィルタリングオプション

オプション型例
whereオブジェクト{ userId: 'abc', status: 'active' }
orderByオブジェクト{ createdAt: 'desc' }
limit数値20
offset数値0
select配列['id', 'title']

認証と RLS

REST CRUD はデフォルトで JWT によって保護されています。ユーザーごとのデータを扱う場合は、認証を初期化してください。RLS により、サーバー側でユーザーごとのアクセスが強制されます。

const blink = createClient({
  projectId: process.env.NEXT_PUBLIC_BLINK_PROJECT_ID,
  publishableKey: process.env.NEXT_PUBLIC_BLINK_PUBLISHABLE_KEY,
  auth: { mode: 'managed' },
})

非同期操作に関する警告

非同期操作(AI、アップロード)が完了する前に DB レコードを作成しないでください。NULL 許容フィールドやデータの欠落により、NOT NULL 制約に違反するおそれがあります。すべてのデータが揃ってからレコードを作成してください。

コメント