소스 검색

fix(db): 修复卡牌数据重复插入导致分类字段无法更新问题

- 将原有的 INSERT IGNORE 改为 ON DUPLICATE KEY UPDATE 实现 upsert
- 仅更新分类相关字段 major_category_name、pg_label 和 sales_date,保留其它字段不变
- 解决历史数据中分类字段为 NULL 不能回填的情况
- 保持唯一键 card_id 和 crawler_language 约束不变
- 增强了数据自愈能力,支持重爬时自动刷新分类信息
charley 1 개월 전
부모
커밋
783ddbfc5d
1개의 변경된 파일16개의 추가작업 그리고 1개의 파일을 삭제
  1. 16 1
      pokemon_tcg_spider/fan_pokemon_card_spider.py

+ 16 - 1
pokemon_tcg_spider/fan_pokemon_card_spider.py

@@ -168,7 +168,22 @@ def get_list_single_page(log, sql_pool, page, cate_tuple):
         info_list.append(data_dict)
 
     if info_list:
-        sql_pool.insert_many(table="pokemon_card_record", data_list=info_list, ignore=True)
+        # 用 upsert 入库:新卡照常插入;已存在的卡(唯一键 card_id+crawler_language)只刷新
+        # 分类三列(major_category_name/pg_label/sales_date),不动 card_name/card_no/img 等其它字段。
+        # 变更原因(2026/07/03):原 INSERT IGNORE 遇已存在卡会整行跳过,导致早期旧代码入库、
+        # 分类三列为 NULL 的历史行永远回填不上;改为 ON DUPLICATE KEY UPDATE 后重爬即可自愈。
+        cols = ["card_id", "major_category_name", "pg_label",
+                "sales_date", "detail_url", "img", "crawler_language"]
+        placeholders = ", ".join(["%s"] * len(cols))
+        upsert_sql = f"""
+            INSERT INTO pokemon_card_record ({', '.join(cols)}) VALUES ({placeholders})
+            ON DUPLICATE KEY UPDATE
+                major_category_name = VALUES(major_category_name),
+                pg_label            = VALUES(pg_label),
+                sales_date          = VALUES(sales_date)
+        """
+        args_list = [tuple(d[c] for c in cols) for d in info_list]
+        sql_pool.insert_many(query=upsert_sql, args_list=args_list)
 
     return len(tag_li_list)