feat: 日报事件多新闻源入库(news_event.sources 列)

- ExtractedEvent 增加 sources 字段(主源居首去重,旧产物兜底 [source_id])
- extract_event(_async) 增加 sources 参数;run_event_extraction 读取
  deduped uniques 的 sources 透传
- reporter _load_events_from_dir 读取 sources → EventRow.sources
- news_event 建表加 sources TEXT 列;init_schema 幂等迁移旧表(捕获
  Duplicate column);save_report INSERT 写 JSON 多源
- 新增测试:ExtractedEvent/EventRow.sources 兜底与保序、_load_events_from_dir 多源
This commit is contained in:
2026-08-12 12:56:04 +08:00
parent 182f788857
commit 794ce6c853
10 changed files with 129 additions and 7 deletions
+14 -4
View File
@@ -11,7 +11,7 @@ import pymysql
from loguru import logger
from .models import ReportData
from .schema import DDL_STATEMENTS
from .schema import _ALTER_ADD_SOURCES, DDL_STATEMENTS
@dataclass(frozen=True)
@@ -60,10 +60,19 @@ def connect(cfg: DbConfig | None = None) -> pymysql.Connection:
def init_schema(conn: pymysql.Connection) -> None:
"""建表(CREATE TABLE IF NOT EXISTS ×2),幂等。"""
"""建表(CREATE TABLE IF NOT EXISTS ×2)+ 旧表 sources 列迁移,幂等。"""
with conn.cursor() as cur:
for ddl in DDL_STATEMENTS:
cur.execute(ddl)
# 旧库兼容:news_event 已存在但缺 sources 列时补列
try:
cur.execute(_ALTER_ADD_SOURCES)
logger.info("news_event 迁移:新增 sources 多源列")
except pymysql.err.OperationalError as e:
if e.args and "Duplicate column" in str(e.args[0]):
logger.debug("news_event.sources 列已存在,跳过迁移")
else:
raise
conn.commit()
logger.info("news_report / news_event 建表完成")
@@ -112,8 +121,8 @@ def save_report(conn: pymysql.Connection, report: ReportData) -> int:
"""
INSERT INTO news_event
(report_id, section, rank, importance, event_type, title,
summary, sentiment, source, url)
VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
summary, sentiment, source, sources, url)
VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
""",
(
report_id,
@@ -125,6 +134,7 @@ def save_report(conn: pymysql.Connection, report: ReportData) -> int:
ev.summary,
ev.sentiment,
ev.source,
json.dumps(ev.sources, ensure_ascii=False) if ev.sources else None,
ev.url,
),
)