how-to-store-sqlite-as-nosql-store について
SQLiteでJSONデータをパスベースのキーとともに保存し、スキーマレスなドキュメントストアとして使う方法を解説します。SQLiteでドキュメント形式のデータを保存・検索したい開発者向けで、任意のTTLによる期限切れにも対応します。
主な機能
- 01パスをキーにしたJSONドキュメント保存
- 02SQLiteのJSON関数
- 03パスプレフィックスによるコレクション検索
- 04任意のTTL設定
- 05期限切れ行の削除
活用シーン
- 01SQLiteでドキュメント形式のデータを保存
- 02パスプレフィックス配下のドキュメントを検索
- 03TTLを使った期限切れレコードの整理
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ rodydavis/ skills --skill how-to-store-sqlite-as-nosql-storeインストール後、Claude Code で/how-to-store-sqlite-as-nosql-storeを入力して読み込まれたか確認します。
詳細
SQLite を NoSQL ストアとして保存する方法
SQLite は、さまざまな形状のデータを保存できる非常に高性能なエッジデータベースです。
データをスキーマレスで保存できるため、NoSQL データベース は非常に人気がありますが、こうしたドキュメントを SQLite に保存することも十分に可能です。
SQLite は優れた JSON サポートを備えており、JSONB にも対応しています。
テーブルを作成する
JSON ドキュメントを保存するには、値を文字列として保存するテーブルを作成する必要があります。
CREATE TABLE documents (
path TEXT NOT NULL PRIMARY KEY,
data TEXT,
ttl INTEGER,
created INTEGER NOT NULL,
updated INTEGER NOT NULL,
UNIQUE(path)
);
パス
データ
TTL
作成日時
更新日時
/posts/1
{"id":1}
NULL
0
0
/posts/2
{"id":2}
NULL
0
0
/users/1
{"id":1}
NULL
0
0
基本的な考え方は、JSON オブジェクトと一意のパスを保存することです。
任意で TTL を設定すると、期限切れになった行を自動的に削除できます。
ドキュメントを保存する
ドキュメントを保存するには、JSON を文字列またはバイナリにエンコードし、一意のパスを指定してテーブルに保存します。
INSERT OR REPLACE
INTO documents (path, data, ttl, created, updated)
VALUES (:path, :data, :ttl, :created, :updated)
RETURNING *;
JSON 関数を使って、オブジェクトを有効な JSON 文字列として保存することもできます。
INSERT OR REPLACE
INTO documents (path, data, ttl, created, updated)
VALUES ("/posts/1", json('{"id" 1}'), NULL, 0, 0)
RETURNING *;
パス
データ
TTL
作成日時
更新日時
/posts/1
{"id":1}
NULL
0
0
ドキュメントを読み取る
ドキュメントを読み取るには、パスだけが必要です。TTL が設定されている場合は、現在の日付がオフセットを超えているかどうかを計算し、超えていればドキュメントを返さないようにできます。
SELECT * FROM documents
WHERE path = :path
AND (
(ttl IS NOT NULL AND ttl + updated < unixepoch())
OR
ttl IS NULL
);
パス
データ
TTL
作成日時
更新日時
/posts/1
{"id":1}
NULL
0
0
コレクションのドキュメントを取得する
組み込み関数とパスのプレフィックスを使って、指定したコレクションのすべてのドキュメントをクエリできます。
SELECT *
FROM documents
WHERE (
path LIKE :prefix
AND
(LENGTH(path) - LENGTH(REPLACE(path, '/', ''))) = (LENGTH(:prefix) - LENGTH(REPLACE(:prefix, '/', '')))
)
AND (
(ttl IS NOT NULL AND ttl + updated < unixepoch())
OR
ttl IS NULL
)
ORDER BY created;
末尾に /% を付けた :prefix を検索することを想定しています。
"/my/path/%" // search for /my/path
期限切れのドキュメントを削除する
TTL フィールドを使うと、期限切れのドキュメントをすべて削除できます。
DELETE FROM documents
WHERE ttl IS NOT NULL
AND ttl + updated < unixepoch();