新增json自动迁移功能

This commit is contained in:
KawakazeNotFound 2025-11-07 16:13:00 +08:00
parent 57e1b8acbb
commit 83f4803183
2 changed files with 27 additions and 13 deletions

View file

@ -52,6 +52,7 @@ if TYPE_CHECKING:
from .db_manager import DatabaseManager
from .models import ChatHistory, ChatMessage, GroupChatState, PrivateChatState
from .migration import migrate_from_json_to_db
__plugin_meta__ = PluginMetadata(
name="llmchat",
@ -800,6 +801,9 @@ async def load_state():
@driver.on_startup
async def init_plugin():
logger.info("插件启动初始化")
# 首先进行数据迁移(如果存在 JSON 文件)
logger.info("检查是否需要进行 JSON 数据迁移...")
await migrate_from_json_to_db(Config(llmchat=plugin_config))
await load_state()
# 每30分钟保存一次状态作为备份已开启实时保存
scheduler.add_job(save_state, "interval", minutes=30)

View file

@ -10,7 +10,7 @@ from datetime import datetime
from nonebot import logger
from .config import Config, get_plugin_config
from .config import Config
from .db_manager import DatabaseManager
from .models import ChatHistory, GroupChatState, PrivateChatState
@ -35,6 +35,9 @@ async def migrate_from_json_to_db(plugin_config: Config):
logger.info("未找到群组状态 JSON 文件,跳过迁移")
return
total_migrated_groups = 0
total_migrated_users = 0
try:
# 迁移群组状态
logger.info(f"正在迁移群组状态数据: {data_file}")
@ -77,7 +80,8 @@ async def migrate_from_json_to_db(plugin_config: Config):
logger.error(f"迁移群组 {gid_str} 失败: {e}")
logger.info(f"成功迁移 {migrated_groups} 个群组的状态")
total_migrated_groups = migrated_groups
except Exception as e:
logger.error(f"迁移群组状态失败: {e}")
@ -123,30 +127,36 @@ async def migrate_from_json_to_db(plugin_config: Config):
logger.error(f"迁移用户 {uid_str} 失败: {e}")
logger.info(f"成功迁移 {migrated_users} 个用户的私聊状态")
total_migrated_users = migrated_users
except Exception as e:
logger.error(f"迁移私聊状态失败: {e}")
logger.info("JSON 迁移完成")
# 迁移成功后,重命名 JSON 文件为 .migrated
if total_migrated_groups > 0 or total_migrated_users > 0:
logger.info("迁移成功,开始重命名 JSON 文件...")
rename_json_files_to_migrated()
logger.info(f"JSON 迁移完成(群组: {total_migrated_groups},用户: {total_migrated_users}")
async def backup_json_files():
"""备份旧的 JSON 文件"""
def rename_json_files_to_migrated():
"""将已迁移的 JSON 文件重命名为 .migrated"""
if not data_file:
return
if os.path.exists(data_file):
backup_file = f"{data_file}.backup"
migrated_file = f"{data_file}.migrated"
try:
os.rename(data_file, backup_file)
logger.info(f"备份群组状态文件: {backup_file}")
os.rename(data_file, migrated_file)
logger.info(f"将群组状态文件重命名为: {migrated_file}")
except Exception as e:
logger.warning(f"备份文件失败: {e}")
logger.warning(f"重命名文件失败: {e}")
if private_data_file and os.path.exists(private_data_file):
backup_file = f"{private_data_file}.backup"
migrated_file = f"{private_data_file}.migrated"
try:
os.rename(private_data_file, backup_file)
logger.info(f"备份私聊状态文件: {backup_file}")
os.rename(private_data_file, migrated_file)
logger.info(f"将私聊状态文件重命名为: {migrated_file}")
except Exception as e:
logger.warning(f"备份文件失败: {e}")
logger.warning(f"重命名文件失败: {e}")