数据持久化
本页面旨在指导开发者如何在简单服务中将数据持久化。
对于后台插件,数据应存储在插件目录下的 data 目录中。插件启动后,系统会自动将该目录挂载为可写。为了确保数据在插件重启后不会丢失,必须将所有数据存放在此目录下。如果数据存放在其他目录,插件重启后将无法恢复这些数据,从而导致数据丢失。
警告
机器人断电后可能造成文件缓存数据丢失。建议在写入数据文件后调用 sync 命令,确保数据刷新到磁盘。
示例代码:
py
import os
os.system("sync")数据操作建议
- 本地文件存储:对于小型数据,推荐使用 JSON、SQLite 等文件存储方案。
- 数据库存储:对于更复杂的数据需求,可以选择数据库进行持久化。
创建简单服务插件包
在下面的示例中,我们将创建一个简单服务类型的插件。该插件将对外提供配置写入、配置读取、配置删除接口,并将数据持久化到 SQLite 数据库中。
提示
下文中的 DataService 就是我们即将创建的简单服务的插件名。
步骤一:创建插件文件夹
首先我们需要创建一份插件基本文件夹,该文件夹需包含一个 config.json 配置文件和一个 Python 文件,注意简单服务中,Python 文件的名称必须与插件名称相同。
您可以从头开始手动创建,也可以使用插件开发包仓库中 "demo" 目录下的模板进行修改。
目录结构:
- DataService
- config.json
- 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 Falsejson
{
"name": "DataService",
"type": "easyService",
"scriptLang": "python",
"description": "数据服务",
"version": "0.1"
}步骤二:打包、安装
插件打包请参考打包与安装
步骤三:调用接口
- 设置配置:访问
http://10.27.1.254:5616/DataService/set_robot_config?key=model_type&value=GBT-C5A
此操作会写入一个配置项,名称为 model_type ,值为 GBT-C5A 。
- 获取配置:访问
http://10.27.1.254:5616/DataService/get_robot_config?key=model_type
正常情况下会返回:
json
{
"result": "GBT-C5A"
}- 删除配置:访问
http://10.27.1.254:5616/DataService/delete_robot_config?key=model_type
此操作会将配置项 model_type 删除。
注:更多调用方式请参照相关章节。