Skip to content

Storage API

src.app.plugin_system.api.storage_api 提供两种独立存储能力:JSON 文件存储(基于 JSONStore)和 PluginDatabase(SQLite)。

JSON 存储

简单键值存储,每个 store_name 对应 data/json_storage/<store_name>/ 目录,不同插件互不干扰。底层使用 src.kernel.storage.JSONStore

python
from src.app.plugin_system.api.storage_api import (
    save_json, load_json, delete_json, exists_json, list_json,
)
函数说明
save_json(store_name, name, data) -> None保存 JSON 数据
load_json(store_name, name) -> dict | None加载 JSON 数据,键不存在时返回 None
delete_json(store_name, name) -> bool删除 JSON 数据,键不存在时返回 False
exists_json(store_name, name) -> bool检查键是否存在
list_json(store_name) -> list[str]列出所有键名(不含 .json 后缀)
python
await save_json("my_plugin", "settings", {"theme": "dark"})
settings = await load_json("my_plugin", "settings")

JSONStore

src.app.plugin_system.api.storage_api 同时导出底层 JSONStore 类,可直接构造以使用自定义目录或更细粒度的控制:

python
from src.app.plugin_system.api.storage_api import JSONStore

store = JSONStore("data/my_plugin/custom_store")
await store.save("key", {"a": 1})
data = await store.load("key")

PluginDatabase

插件独立 SQLite 数据库,提供标准 CRUD/QueryBuilder/AggregateQuery 接口。

永远使用 SQLite,在指定路径独立存储,与主程序数据库不共享任何引擎或连接。

python
from src.app.plugin_system.api.storage_api import PluginDatabase
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
from sqlalchemy import Integer, Text

class Base(DeclarativeBase):
    pass

class MyRecord(Base):
    __tablename__ = "my_records"
    id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
    name: Mapped[str] = mapped_column(Text, nullable=False)

db = PluginDatabase("data/my_plugin/data.db", [MyRecord])
await db.initialize()

# CRUD
record = await db.crud(MyRecord).create({"name": "hello"})

# 查询
results = await db.query(MyRecord).filter(name="hello").all()

# 聚合
counts = await db.aggregate(MyRecord).group_by_count("name")

# 原始 session(复杂操作)
async with db.session() as s:
    await s.execute(...)

await db.close()

方法

方法说明
db.initialize() -> None初始化引擎并建表(幂等),启用 WAL / NORMAL 等性能优化 pragma
db.crud(model) -> CRUDBase获取 CRUD 实例
db.query(model) -> QueryBuilder获取查询构建器
db.aggregate(model) -> AggregateQuery获取聚合查询
db.invalidate(model) -> None使原始 SQL 写入后该模型的进程内读缓存失效
db.session() -> AsyncGenerator[AsyncSession, None]获取原始 session(上下文管理器),会话退出时自动提交,异常时自动回滚
db.close() -> None关闭数据库引擎,释放所有连接资源

初始化约束

使用 crudqueryaggregatesession 方法前必须先调用 await db.initialize(),否则会抛出 RuntimeError

相关文档

贡献者

The avatar of contributor named as minecraft1024a minecraft1024a
The avatar of contributor named as micraft1024a micraft1024a
The avatar of contributor named as Windpicker-owo Windpicker-owo

页面历史

Released under the GPL-3.0 License.