Skip to content

Storage API

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

JSON 存储

简单键值存储,每个 store_name 对应 data/json_storage/<store_name>/ 目录,不同插件互不干扰。

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 数据
delete_json(store_name, name) -> bool删除 JSON 数据
exists_json(store_name, name) -> bool检查键是否存在
list_json(store_name) -> list[str]列出所有键名
python
await save_json("my_plugin", "settings", {"theme": "dark"})
settings = await load_json("my_plugin", "settings")

PluginDatabase

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

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初始化引擎并建表(幂等)
db.crud(model) -> CRUDBase获取 CRUD 实例
db.query(model) -> QueryBuilder获取查询构建器
db.aggregate(model) -> AggregateQuery获取聚合查询
db.session() -> AsyncGenerator[AsyncSession]获取原始 session(上下文管理器)
db.close() -> None关闭数据库引擎

贡献者

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

页面历史

Released under the GPL-3.0 License.