fix: 防御性编程确保keyword_scores表存在,解决no such table错误 (Task #1657)
This commit is contained in:
@@ -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
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user