mcpField
H
how-to-store-sqlite-as-nosql-store

how-to-store-sqlite-as-nosql-store

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

how-to-store-sqlite-as-nosql-store について

SQLiteでJSONデータをパスベースのキーとともに保存し、スキーマレスなドキュメントストアとして使う方法を解説します。SQLiteでドキュメント形式のデータを保存・検索したい開発者向けで、任意のTTLによる期限切れにも対応します。

主な機能

  1. 01パスをキーにしたJSONドキュメント保存
  2. 02SQLiteのJSON関数
  3. 03パスプレフィックスによるコレクション検索
  4. 04任意のTTL設定
  5. 05期限切れ行の削除

活用シーン

  1. 01SQLiteでドキュメント形式のデータを保存
  2. 02パスプレフィックス配下のドキュメントを検索
  3. 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();

デモ

コメント