fix: preserve runtime settings and user config compatibility

This commit is contained in:
jxxghp
2026-08-23 03:40:47 +08:00
parent 48e3eb08ec
commit e15c4668bd
3 changed files with 71 additions and 11 deletions
+27 -3
View File
@@ -1,9 +1,13 @@
from typing import Any, Union, Dict, Optional
from typing import Any, Union, Dict, Optional, List
from sqlalchemy import select
from sqlalchemy.orm import Session
from app.db.base import DbOper
from app.db.models.userconfig import UserConfig
from app.schemas.types import UserConfigKey
from app.foundation.singleton import Singleton
from app.db.decorators import run_legacy_sync_query
class UserConfigOper(DbOper, metaclass=Singleton):
@@ -16,9 +20,29 @@ class UserConfigOper(DbOper, metaclass=Singleton):
"""
super().__init__()
self.__USERCONF = {}
for item in UserConfig.list(self._db):
for item in self._list_configs():
self.__set_config_cache(username=item.username, key=item.key, value=item.value)
def _with_sync_session(self, operation):
"""在显式会话或兼容查询会话中执行只读操作。"""
if isinstance(self._db, Session):
return operation(self._db)
return run_legacy_sync_query(operation)
def _list_configs(self) -> List[UserConfig]:
"""读取全部用户配置,避免把 None 会话传入已显式化的 Model。"""
return self._with_sync_session(
lambda session: list(session.execute(select(UserConfig)).scalars().all())
)
def _get_by_key(self, username: str, key: str) -> Optional[UserConfig]:
"""按用户名和键读取配置,复用调用方事务或一次性兼容会话。"""
return self._with_sync_session(
lambda session: UserConfig.get_by_key(
db=session, username=username, key=key
)
)
def set(self, username: str, key: Union[str, UserConfigKey], value: Any):
"""
设置用户配置
@@ -28,7 +52,7 @@ class UserConfigOper(DbOper, metaclass=Singleton):
# 更新内存
self.__set_config_cache(username=username, key=key, value=value)
# 写入数据库
conf = UserConfig.get_by_key(db=self._db, username=username, key=key)
conf = self._get_by_key(username=username, key=key)
if conf:
if value:
self._stage_update(conf, {"value": value})