blink-database について
blink-databaseは、Blinkのデータベースクエリ、スキーマ、SDKによるCRUD操作を扱うスキルです。SQL、絞り込みや一括操作に加え、SQLiteの真偽値とJWTで保護されたユーザー単位のアクセスも説明します。
主な機能
- 01SQLクエリの実行
- 02データベーススキーマの確認
- 03SDKによるCRUDと一括操作
- 04レコードの絞り込みと並べ替え
- 05SQLiteの真偽値への対応
- 06JWT保護とRLSの利用
活用シーン
- 01テーブルの作成と確認
- 02アプリのレコードの検索や更新
- 03データベース変更の一括処理
- 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 制約に違反するおそれがあります。すべてのデータが揃ってからレコードを作成してください。
コメント
Markdown 対応