feat:webui默认infoLog,移除display_message字段
This commit is contained in:
@@ -59,7 +59,6 @@ class MaiMessage(BaseDatabaseDataModel[Messages]):
|
||||
self.reply_to: Optional[str] = None
|
||||
|
||||
self.processed_plain_text: Optional[str] = None
|
||||
self.display_message: Optional[str] = None
|
||||
self.raw_message: MessageSequence
|
||||
|
||||
@classmethod
|
||||
@@ -86,7 +85,6 @@ class MaiMessage(BaseDatabaseDataModel[Messages]):
|
||||
obj.reply_to = db_record.reply_to
|
||||
obj.session_id = db_record.session_id
|
||||
obj.processed_plain_text = db_record.processed_plain_text
|
||||
obj.display_message = db_record.display_message
|
||||
obj.raw_message = MessageUtils.from_db_record_msg_to_MaiSeq(db_record.raw_content)
|
||||
return obj
|
||||
|
||||
@@ -113,7 +111,6 @@ class MaiMessage(BaseDatabaseDataModel[Messages]):
|
||||
is_notify=self.is_notify,
|
||||
raw_content=MessageUtils.from_MaiSeq_to_db_record_msg(self.raw_message),
|
||||
processed_plain_text=self.processed_plain_text,
|
||||
display_message=self.display_message,
|
||||
additional_config=additional_config,
|
||||
)
|
||||
|
||||
|
||||
@@ -51,7 +51,6 @@ class Messages(SQLModel, table=True):
|
||||
# 消息内容
|
||||
raw_content: bytes = Field(sa_column=Column(LargeBinary)) # msgpack后的原始消息内容
|
||||
processed_plain_text: Optional[str] = Field(default=None) # 平面化处理后的纯文本消息
|
||||
display_message: Optional[str] = Field(default=None) # 显示的消息内容(被放入Prompt)
|
||||
|
||||
# 其他配置
|
||||
additional_config: Optional[str] = Field(default=None) # 额外配置,JSON格式存储
|
||||
|
||||
@@ -8,12 +8,14 @@ from .registry import MigrationRegistry
|
||||
from .resolver import BaseSchemaVersionDetector, SchemaVersionResolver
|
||||
from .schema import SQLiteSchemaInspector
|
||||
from .v2_to_v3 import migrate_v2_to_v3
|
||||
from .v3_to_v4 import migrate_v3_to_v4
|
||||
from .version_store import SQLiteUserVersionStore
|
||||
|
||||
EMPTY_SCHEMA_VERSION = 0
|
||||
LEGACY_V1_SCHEMA_VERSION = 1
|
||||
V2_SCHEMA_VERSION = 2
|
||||
LATEST_SCHEMA_VERSION = 3
|
||||
V3_SCHEMA_VERSION = 3
|
||||
LATEST_SCHEMA_VERSION = 4
|
||||
|
||||
_LEGACY_V1_EXCLUSIVE_TABLES = (
|
||||
"chat_streams",
|
||||
@@ -78,9 +80,46 @@ class LatestSchemaVersionDetector(BaseSchemaVersionDetector):
|
||||
return None
|
||||
if not snapshot.has_column("person_info", "user_nickname"):
|
||||
return None
|
||||
if snapshot.has_column("mai_messages", "display_message"):
|
||||
return None
|
||||
return LATEST_SCHEMA_VERSION
|
||||
|
||||
|
||||
class V3SchemaVersionDetector(BaseSchemaVersionDetector):
|
||||
"""v3 schema 结构探测器。"""
|
||||
|
||||
@property
|
||||
def name(self) -> str:
|
||||
return "v3_schema_detector"
|
||||
|
||||
def detect_version(self, snapshot: DatabaseSchemaSnapshot) -> Optional[int]:
|
||||
"""检测数据库是否为 v3 结构。"""
|
||||
|
||||
if any(snapshot.has_table(table_name) for table_name in _LEGACY_V1_EXCLUSIVE_TABLES):
|
||||
return None
|
||||
if not all(snapshot.has_table(table_name) for table_name in _COMMON_MARKER_TABLES):
|
||||
return None
|
||||
if snapshot.has_table("action_records"):
|
||||
return None
|
||||
if snapshot.has_table("thinking_questions"):
|
||||
return None
|
||||
if snapshot.has_column("images", "emotion"):
|
||||
return None
|
||||
if not snapshot.has_column("images", "image_hash"):
|
||||
return None
|
||||
if not snapshot.has_column("images", "full_path"):
|
||||
return None
|
||||
if not snapshot.has_column("images", "image_type"):
|
||||
return None
|
||||
if not snapshot.has_column("chat_history", "session_id"):
|
||||
return None
|
||||
if not snapshot.has_column("person_info", "user_nickname"):
|
||||
return None
|
||||
if not snapshot.has_column("mai_messages", "display_message"):
|
||||
return None
|
||||
return V3_SCHEMA_VERSION
|
||||
|
||||
|
||||
class V2SchemaVersionDetector(BaseSchemaVersionDetector):
|
||||
"""v2 schema 结构探测器。"""
|
||||
|
||||
@@ -174,6 +213,7 @@ def build_default_schema_version_detectors() -> List[BaseSchemaVersionDetector]:
|
||||
|
||||
return [
|
||||
LatestSchemaVersionDetector(),
|
||||
V3SchemaVersionDetector(),
|
||||
V2SchemaVersionDetector(),
|
||||
LegacyV1SchemaDetector(),
|
||||
]
|
||||
@@ -211,10 +251,17 @@ def build_default_migration_registry() -> MigrationRegistry:
|
||||
),
|
||||
MigrationStep(
|
||||
version_from=V2_SCHEMA_VERSION,
|
||||
version_to=LATEST_SCHEMA_VERSION,
|
||||
version_to=V3_SCHEMA_VERSION,
|
||||
name="v2_to_v3",
|
||||
description="移除废弃表,并将 emoji 标签统一收敛到 description 字段。",
|
||||
handler=migrate_v2_to_v3,
|
||||
),
|
||||
MigrationStep(
|
||||
version_from=V3_SCHEMA_VERSION,
|
||||
version_to=LATEST_SCHEMA_VERSION,
|
||||
name="v3_to_v4",
|
||||
description="移除 mai_messages.display_message 弃用列。",
|
||||
handler=migrate_v3_to_v4,
|
||||
),
|
||||
]
|
||||
)
|
||||
|
||||
@@ -489,9 +489,6 @@ def _build_legacy_message_additional_config(row: Mapping[str, Any]) -> Optional[
|
||||
|
||||
legacy_fields = {
|
||||
"intercept_message_level": row.get("intercept_message_level"),
|
||||
"interest_value": row.get("interest_value"),
|
||||
"key_words": row.get("key_words"),
|
||||
"key_words_lite": row.get("key_words_lite"),
|
||||
"priority_info": row.get("priority_info"),
|
||||
"priority_mode": row.get("priority_mode"),
|
||||
"selected_expressions": row.get("selected_expressions"),
|
||||
|
||||
155
src/common/database/migrations/v3_to_v4.py
Normal file
155
src/common/database/migrations/v3_to_v4.py
Normal file
@@ -0,0 +1,155 @@
|
||||
"""v3 schema 升级到 v4 的迁移逻辑。"""
|
||||
|
||||
from sqlalchemy import text
|
||||
from sqlalchemy.engine import Connection
|
||||
|
||||
from src.common.logger import get_logger
|
||||
|
||||
from .exceptions import DatabaseMigrationExecutionError
|
||||
from .models import MigrationExecutionContext
|
||||
from .schema import SQLiteSchemaInspector
|
||||
|
||||
logger = get_logger("database_migration")
|
||||
|
||||
_V3_MESSAGES_BACKUP_TABLE = "__v3_mai_messages_backup"
|
||||
_V4_MESSAGES_CREATE_SQL = """
|
||||
CREATE TABLE mai_messages (
|
||||
id INTEGER NOT NULL,
|
||||
message_id VARCHAR(255) NOT NULL,
|
||||
timestamp DATETIME,
|
||||
platform VARCHAR(100) NOT NULL,
|
||||
user_id VARCHAR(255) NOT NULL,
|
||||
user_nickname VARCHAR(255) NOT NULL,
|
||||
user_cardname VARCHAR(255),
|
||||
group_id VARCHAR(255),
|
||||
group_name VARCHAR(255),
|
||||
is_mentioned BOOLEAN NOT NULL,
|
||||
is_at BOOLEAN NOT NULL,
|
||||
session_id VARCHAR(255) NOT NULL,
|
||||
reply_to VARCHAR(255),
|
||||
is_emoji BOOLEAN NOT NULL,
|
||||
is_picture BOOLEAN NOT NULL,
|
||||
is_command BOOLEAN NOT NULL,
|
||||
is_notify BOOLEAN NOT NULL,
|
||||
raw_content BLOB,
|
||||
processed_plain_text VARCHAR,
|
||||
additional_config VARCHAR,
|
||||
PRIMARY KEY (id)
|
||||
)
|
||||
"""
|
||||
_V4_MESSAGES_INDEX_STATEMENTS = (
|
||||
"CREATE INDEX ix_mai_messages_group_id ON mai_messages (group_id)",
|
||||
"CREATE INDEX ix_mai_messages_message_id ON mai_messages (message_id)",
|
||||
"CREATE INDEX ix_mai_messages_platform ON mai_messages (platform)",
|
||||
"CREATE INDEX ix_mai_messages_session_id ON mai_messages (session_id)",
|
||||
"CREATE INDEX ix_mai_messages_user_id ON mai_messages (user_id)",
|
||||
"CREATE INDEX ix_mai_messages_user_nickname ON mai_messages (user_nickname)",
|
||||
)
|
||||
|
||||
|
||||
def migrate_v3_to_v4(context: MigrationExecutionContext) -> None:
|
||||
"""执行 v3 到 v4 的 schema 迁移。"""
|
||||
|
||||
connection = context.connection
|
||||
total_records = _count_table_rows(connection, "mai_messages")
|
||||
context.start_progress(
|
||||
total_tables=1,
|
||||
total_records=total_records,
|
||||
description="v3 -> v4 迁移进度",
|
||||
table_unit_name="表",
|
||||
record_unit_name="记录",
|
||||
)
|
||||
|
||||
migrated_message_rows = _migrate_messages_table_to_v4(connection)
|
||||
context.advance_progress(
|
||||
records=migrated_message_rows,
|
||||
completed_tables=1,
|
||||
item_name="mai_messages",
|
||||
)
|
||||
|
||||
logger.info(f"v3 -> v4 数据库迁移完成: mai_messages重建={migrated_message_rows}")
|
||||
|
||||
|
||||
def _count_table_rows(connection: Connection, table_name: str) -> int:
|
||||
"""统计表记录数,不存在时返回 0。"""
|
||||
|
||||
schema_inspector = SQLiteSchemaInspector()
|
||||
if not schema_inspector.table_exists(connection, table_name):
|
||||
return 0
|
||||
row = connection.execute(text(f'SELECT COUNT(*) FROM "{table_name}"')).first()
|
||||
return int(row[0]) if row else 0
|
||||
|
||||
|
||||
def _migrate_messages_table_to_v4(connection: Connection) -> int:
|
||||
"""重建 ``mai_messages`` 表并移除弃用的 ``display_message`` 列。"""
|
||||
|
||||
schema_inspector = SQLiteSchemaInspector()
|
||||
if not schema_inspector.table_exists(connection, "mai_messages"):
|
||||
return 0
|
||||
if not schema_inspector.get_table_schema(connection, "mai_messages").has_column("display_message"):
|
||||
return _count_table_rows(connection, "mai_messages")
|
||||
if schema_inspector.table_exists(connection, _V3_MESSAGES_BACKUP_TABLE):
|
||||
raise DatabaseMigrationExecutionError(
|
||||
f"检测到残留备份表 {_V3_MESSAGES_BACKUP_TABLE},无法安全执行 v3 -> v4 mai_messages 迁移。"
|
||||
)
|
||||
|
||||
connection.exec_driver_sql(f'ALTER TABLE "mai_messages" RENAME TO "{_V3_MESSAGES_BACKUP_TABLE}"')
|
||||
connection.exec_driver_sql(_V4_MESSAGES_CREATE_SQL)
|
||||
|
||||
connection.execute(
|
||||
text(
|
||||
f"""
|
||||
INSERT INTO mai_messages (
|
||||
id,
|
||||
message_id,
|
||||
timestamp,
|
||||
platform,
|
||||
user_id,
|
||||
user_nickname,
|
||||
user_cardname,
|
||||
group_id,
|
||||
group_name,
|
||||
is_mentioned,
|
||||
is_at,
|
||||
session_id,
|
||||
reply_to,
|
||||
is_emoji,
|
||||
is_picture,
|
||||
is_command,
|
||||
is_notify,
|
||||
raw_content,
|
||||
processed_plain_text,
|
||||
additional_config
|
||||
)
|
||||
SELECT
|
||||
id,
|
||||
message_id,
|
||||
timestamp,
|
||||
platform,
|
||||
user_id,
|
||||
user_nickname,
|
||||
user_cardname,
|
||||
group_id,
|
||||
group_name,
|
||||
is_mentioned,
|
||||
is_at,
|
||||
session_id,
|
||||
reply_to,
|
||||
is_emoji,
|
||||
is_picture,
|
||||
is_command,
|
||||
is_notify,
|
||||
raw_content,
|
||||
COALESCE(NULLIF(processed_plain_text, ''), display_message),
|
||||
additional_config
|
||||
FROM "{_V3_MESSAGES_BACKUP_TABLE}"
|
||||
ORDER BY id
|
||||
"""
|
||||
)
|
||||
)
|
||||
|
||||
migrated_rows = _count_table_rows(connection, "mai_messages")
|
||||
connection.exec_driver_sql(f'DROP TABLE "{_V3_MESSAGES_BACKUP_TABLE}"')
|
||||
for statement in _V4_MESSAGES_INDEX_STATEMENTS:
|
||||
connection.exec_driver_sql(statement)
|
||||
return migrated_rows
|
||||
Reference in New Issue
Block a user