""" 一次性脚本:将 AI 生成的内容摘要卡写入 episodes 表的 content_digest 字段 数据来源:ai-labeling/experiments/content_digests/_all_digests.json 前置:先手动执行 backend/sql/004_add_content_digest.sql 添加字段 """ import sys import os import json from datetime import date # Windows 终端中文输出 sys.stdout.reconfigure(encoding='utf-8') sys.stderr.reconfigure(encoding='utf-8') # 加 backend 到 path sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', 'backend')) from app.db.session import get_session from app.models.episode import Episode from app.models.user import User # FK 解析需要 from sqlmodel import select # ── 1. 读 digest 数据 ── project_root = os.path.join(os.path.dirname(__file__), '..') digest_file = os.path.join(project_root, 'ai-labeling', 'experiments', 'content_digests', '_all_digests.json') with open(digest_file, 'r', encoding='utf-8') as f: all_digests = json.load(f) print(f"读入 {len(all_digests)} 条摘要记录") # ── 2. 逐条匹配并写入 ── session = next(get_session()) success = 0 skipped = 0 mismatch = 0 for d in all_digests: ep_num = d['ep'] digest_date = d['date'] # "2026-04-21" 格式 # 查 episode ep = session.exec(select(Episode).where(Episode.episode_number == ep_num)).first() if not ep: print(f"⚠️ ep{ep_num:02d} 在数据库中不存在,跳过") skipped += 1 continue # 校验日期 if str(ep.air_date) != digest_date: print(f"⚠️ ep{ep_num:02d} 日期不匹配: DB={ep.air_date}, digest={digest_date},跳过") mismatch += 1 continue # 写入(只存 digest 字段,不存外壳的 ep/date/title/editor/filename/generated_at) ep.content_digest = d['digest'] session.add(ep) success += 1 print(f"✅ ep{ep_num:02d} {ep.program_name} <- digest 已写入") session.commit() # ── 3. 打印统计 ── print() print(f"=== 统计 ===") print(f"成功写入: {success}") print(f"跳过(不存在): {skipped}") print(f"跳过(日期不匹配): {mismatch}") print(f"总记录: {len(all_digests)}") # ── 4. 验证:所有 episodes 的 content_digest 状态 ── print() print(f"=== 验证: episodes content_digest 状态 ===") all_eps = session.exec(select(Episode).order_by(Episode.episode_number)).all() for e in all_eps: has_digest = "✅" if e.content_digest is not None else "❌" print(f"ep{e.episode_number:02d} | {e.program_name} | {e.air_date} | digest: {has_digest}")