sqlite-storage について
Val Townの組み込みSQLiteを、リレーショナルまたは構造化された永続データに使うためのスキルです。データベースのスコープ、アトミックなバッチ、安全なクエリ、スキーマ設定を説明します。
主な機能
- 01Val単位または組織単位のDBを利用
- 02複数SQL文をアトミックに実行
- 03ユーザー入力にパラメーター化クエリを使用
- 04テーブル作成とスキーマ移行
活用シーン
- 01Valのリレーショナルデータを保存
- 02組織内の複数ValでDBデータを共有
- 03複数レコードをアトミックに更新
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ val-town/ plugins --skill sqlite-storageインストール後、Claude Code で/sqlite-storageを入力して読み込まれたか確認します。
詳細
SQLite ストレージ
Val Town には、std/sqlite モジュールを使った SQLite が組み込まれています。val でリレーショナルデータや構造化された永続データが必要な場合は、こちらを使用してください。シンプルなキー/バリュー形式のデータには、代わりに std/blob を使用してください。
基本的な使い方
import { sqlite } from "https://esm.town/v/std/sqlite/main.ts";
await sqlite.execute(`CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
email TEXT UNIQUE
)`);
await sqlite.execute({
sql: "INSERT INTO users (name, email) VALUES (?, ?)",
args: ["Alice", "[email protected]"],
});
const result = await sqlite.execute("SELECT * FROM users");
// result.rows = [{ id: 1, name: "Alice", email: "[email protected]" }]
トランザクション
複数のステートメントをアトミックなトランザクションとして実行するには、sqlite.batch を使用します。すべて成功するか、すべてロールバックされます。
await sqlite.batch([
{ sql: "INSERT INTO users (name, email) VALUES (?, ?)", args: ["Bob", "[email protected]"] },
{ sql: "UPDATE users SET name = ? WHERE id = ?", args: ["Robert", 2] },
]);
val ごとのデータベースと組織ごとのデータベース
インポートパスによって使用するデータベースが決まります。どちらも同じ @libsql/client API(execute、batch)を公開し、行をキー付きオブジェクト(Record<string, unknown>[])として返します。
std/sqlite/main.ts— val スコープのデータベースで、この val 専用です。新しい val のデフォルトであり、ほとんどの場合こちらを使用します。std/sqlite/global.ts— 組織スコープのデータベースで、同じアカウントが所有するすべての val で共有されます。(ここでは個人アカウントもそれ自体が組織として扱われるため、このデータベースはすべての val 間で共有されます。)
既存の val で、これらのインポートパスを切り替えないでください。val が読み書きするデータベースが変わります。
ツールを使った組織所有 val のクエリ
sqlite_execute または sqlite_batch ツールを使って、個人アカウントではなく組織が所有する val にクエリを実行する場合は、適切なデータベースにアクセスできるよう、組織のハンドルを org パラメーターに渡してください。例:{ sql: "SELECT * FROM users", org: "some-org" }。これはツール呼び出しにのみ関係します。val 内のコードは、自身のデータベースを自動的に読み取ります。
ルール
- ユーザー入力に由来する値には、必ずパラメーター化クエリ(
argsフィールド)を使用してください。文字列を SQL に直接埋め込まないでください。 - val の再起動後もスキーマ設定を冪等にするため、
CREATE TABLE IF NOT EXISTSを使用してください。 - スキーマのマイグレーション:
ALTER TABLE ... ADD COLUMNで新しい列を追加してください。更新済みのテーブルに対してマイグレーションが実行される可能性がある場合は、try/catchで囲んでください。
リファレンス
API ドキュメント全文:https://docs.val.town/reference/std/sqlite/usage/