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. 02使用 SQLite JSON 函数
  3. 03按路径前缀查询集合
  4. 04可选 TTL 过期设置
  5. 05删除已过期行

适用场景

  1. 01在 SQLite 中保存文档形态的数据
  2. 02查询指定路径前缀下的文档
  3. 03通过 TTL 清理过期记录

安装

复制下面的命令,在终端中运行。

$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();

演示

评论

支持 Markdown