Skip to content

数据持久化

本页面旨在指导开发者如何在简单服务中将数据持久化。

对于后台插件,数据应存储在插件目录下的 data 目录中。插件启动后,系统会自动将该目录挂载为可写。为了确保数据在插件重启后不会丢失,必须将所有数据存放在此目录下。如果数据存放在其他目录,插件重启后将无法恢复这些数据,从而导致数据丢失。

警告

机器人断电后可能造成文件缓存数据丢失。建议在写入数据文件后调用 sync 命令,确保数据刷新到磁盘。

示例代码:

py
import os

os.system("sync")

数据操作建议

  1. 本地文件存储:对于小型数据,推荐使用 JSON、SQLite 等文件存储方案。
  2. 数据库存储:对于更复杂的数据需求,可以选择数据库进行持久化。

创建简单服务插件包

在下面的示例中,我们将创建一个简单服务类型的插件。该插件将对外提供配置写入、配置读取、配置删除接口,并将数据持久化到 SQLite 数据库中。

提示

下文中的 DataService 就是我们即将创建的简单服务的插件名。

步骤一:创建插件文件夹

首先我们需要创建一份插件基本文件夹,该文件夹需包含一个 config.json 配置文件和一个 Python 文件,注意简单服务中,Python 文件的名称必须与插件名称相同

您可以从头开始手动创建,也可以使用插件开发包仓库中 "demo" 目录下的模板进行修改。

目录结构:

  • DataService
    • config.json
    • DataService.py
DataService.py
py
from pathlib import Path
import sqlite3

# 获取全局logger实例,只能在简单服务中使用
logger = globals().get('logger')
if logger is None:
    # 本地调试时,使用自带日志库
    import logging
    logging.basicConfig(level=logging.INFO)
    logger = logging.getLogger(__name__)


def __init_db():
    """
    初始化数据库
    """
    try:
        current_dir = Path(__file__).parent.resolve()
        data_dir = current_dir / 'data'

        # 如果data目录不存在,手动创建
        if not data_dir.exists():
            data_dir.mkdir(parents=True)
        db_path = data_dir / 'data.db'

        # 连接到数据库
        conn = sqlite3.connect(db_path)
        cursor = conn.cursor()
        logger.info("数据库打开成功")

        # 创建表
        cursor.execute('''
            CREATE TABLE IF NOT EXISTS `robot_config` (
                `id`            INTEGER PRIMARY KEY AUTOINCREMENT,
                `key`           VARCHAR(255)    NOT NULL UNIQUE,
                `value`         TEXT     NOT NULL
            );
        ''')
        logger.info("表创建成功")
        conn.commit()

        return conn
    except Exception as e:
        logger.error(f"初始化数据库失败: {e}")
        return None


conn = __init_db()
"""
全局变量,用于持有唯一的数据库连接实例
"""


def get_robot_config(key: str):
    """根据 key 获取配置值。"""
    try:
        cursor = conn.cursor()
        cursor.execute('SELECT value FROM robot_config WHERE key = ?', (key,))
        result = cursor.fetchone()
        return result[0] if result else None
    except sqlite3.Error as e:
        logger.error(f"获取配置 '{key}' 失败: {e}")
        return None


def set_robot_config(key: str, value: str):
    """设置或更新一个配置项。"""
    try:
        cursor = conn.cursor()
        cursor.execute('INSERT OR REPLACE INTO robot_config (key, value) VALUES (?, ?)', (key, str(value)))
        conn.commit()
        logger.info(f"配置 '{key}' 已设置为 '{value}'。")
        return True
    except sqlite3.Error as e:
        logger.error(f"设置配置 '{key}' 失败: {e}")
        return False

def delete_robot_config(key: str):
    """根据 key 删除一个配置项。"""
    try:
        cursor = conn.cursor()
        cursor.execute('DELETE FROM robot_config WHERE key = ?', (key,))
        conn.commit()
        logger.info(f"配置 '{key}' 已删除。")
        return True
    except sqlite3.Error as e:
        logger.error(f"删除配置 '{key}' 失败: {e}")
        return False
config.json
json
{
  "name": "DataService",
  "type": "easyService",
  "scriptLang": "python",
  "description": "数据服务",
  "version": "0.1"
}

步骤二:打包、安装

插件打包请参考打包与安装

步骤三:调用接口

  1. 设置配置:访问 http://10.27.1.254:5616/DataService/set_robot_config?key=model_type&value=GBT-C5A

此操作会写入一个配置项,名称为 model_type ,值为 GBT-C5A

  1. 获取配置:访问 http://10.27.1.254:5616/DataService/get_robot_config?key=model_type

正常情况下会返回:

json
{
  "result": "GBT-C5A"
}
  1. 删除配置:访问 http://10.27.1.254:5616/DataService/delete_robot_config?key=model_type

此操作会将配置项 model_type 删除。

注:更多调用方式请参照相关章节