fix: 防御性编程确保keyword_scores表存在,解决no such table错误 (Task #1657)

This commit is contained in:
youpaishidifu
2026-08-31 23:39:38 +08:00
parent 589ea7ef4e
commit 9726945b25
+43
View File
@@ -56,6 +56,38 @@ class KeywordScorer:
conn.close() conn.close()
logger.debug(f"[keyword-scorer] DB初始化完成: {self.db_path}") logger.debug(f"[keyword-scorer] DB初始化完成: {self.db_path}")
def _ensure_keyword_scores_table(self):
"""确保keyword_scores表存在(防御性编程)"""
conn = sqlite3.connect(self.db_path, check_same_thread=False)
try:
cursor = conn.execute("SELECT name FROM sqlite_master WHERE type='table' AND name='keyword_scores'")
if not cursor.fetchone():
logger.warning("[keyword-scorer] keyword_scores表不存在,重新创建")
conn.execute("""
CREATE TABLE IF NOT EXISTS keyword_scores (
id INTEGER PRIMARY KEY AUTOINCREMENT,
platform TEXT NOT NULL,
message_text TEXT NOT NULL,
message_hash TEXT NOT NULL,
score INTEGER NOT NULL DEFAULT 0,
matched_keywords TEXT NOT NULL DEFAULT '',
local_time TIMESTAMP NOT NULL,
is_new_message INTEGER NOT NULL DEFAULT 1
)
""")
conn.execute("""
CREATE INDEX IF NOT EXISTS idx_keyword_scores_platform_time
ON keyword_scores(platform, local_time)
""")
conn.execute("""
CREATE INDEX IF NOT EXISTS idx_keyword_scores_hash
ON keyword_scores(message_hash)
""")
conn.commit()
logger.warning("[keyword-scorer] keyword_scores表已重新创建")
finally:
conn.close()
def extract_keywords(self, text: str) -> List[str]: def extract_keywords(self, text: str) -> List[str]:
"""提取两字一组的关键词 """提取两字一组的关键词
@@ -110,6 +142,9 @@ class KeywordScorer:
if not keywords: if not keywords:
return 0, [] return 0, []
# 防御性编程:确保表存在
self._ensure_keyword_scores_table()
conn = sqlite3.connect(self.db_path, check_same_thread=False) conn = sqlite3.connect(self.db_path, check_same_thread=False)
try: try:
# 获取最近N分钟的bot回复关键词 # 获取最近N分钟的bot回复关键词
@@ -168,6 +203,9 @@ class KeywordScorer:
matched_keywords: 匹配到的关键词 matched_keywords: 匹配到的关键词
is_new: 是否为新消息(score<=1为True) is_new: 是否为新消息(score<=1为True)
""" """
# 防御性编程:确保表存在
self._ensure_keyword_scores_table()
import hashlib import hashlib
message_hash = hashlib.md5(message_text.strip().encode('utf-8')).hexdigest() message_hash = hashlib.md5(message_text.strip().encode('utf-8')).hexdigest()
local_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S") local_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
@@ -192,6 +230,8 @@ class KeywordScorer:
keywords = self.extract_keywords(text) keywords = self.extract_keywords(text)
if not keywords: if not keywords:
return 0 return 0
# 防御性编程:确保表存在
self._ensure_keyword_scores_table()
conn = sqlite3.connect(self.db_path, check_same_thread=False) conn = sqlite3.connect(self.db_path, check_same_thread=False)
try: try:
cursor = conn.execute(""" cursor = conn.execute("""
@@ -272,6 +312,9 @@ class KeywordScorer:
exclude_id: 排除刚插入的当前消息记录id(防止自拦截) exclude_id: 排除刚插入的当前消息记录id(防止自拦截)
""" """
# 防御性编程:确保表存在
self._ensure_keyword_scores_table()
import hashlib import hashlib
from datetime import timedelta from datetime import timedelta