From b511dbc9623d1da14de3ad64c7175bd76dbb73c3 Mon Sep 17 00:00:00 2001 From: Franklin-F Date: Sun, 29 Jun 2025 11:36:36 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0select=E5=AF=BC?= =?UTF-8?q?=E5=85=A5=E4=BB=A5=E6=94=AF=E6=8C=81=E6=9F=A5=E8=AF=A2=E6=93=8D?= =?UTF-8?q?=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DB.py | 122 +++++++++++++++++++++++++++++----------------------------- 1 file changed, 62 insertions(+), 60 deletions(-) diff --git a/DB.py b/DB.py index 4374939..0e5f1e2 100644 --- a/DB.py +++ b/DB.py @@ -802,26 +802,24 @@ class DBSA: # 生成所有视频唯一键 (v_xid, v_name) all_vid_keys = list({(row["v_xid"], row["v_name"]) for row in vid_rows}) - conn = _engine.connect() - try: - # 查询数据库中已存在的视频记录 - sel_vid = select([ - video.c.v_xid, - video.c.v_name - ]).where( - tuple_(video.c.v_xid, video.c.v_name).in_(all_vid_keys) - ) - result = conn.execute(sel_vid) - vid_existing_keys = {(row.v_xid, row.v_name) for row in result} - except Exception as e: - logger.error(f"查询视频表时异常: {e}") + if all_vid_keys: # 仅当有键时才查询 + conn = _engine.connect() try: - cls.push_record_many(payloads) - except Exception as re: - logger.error("[Redis 回退失败]", re) - return - finally: - conn.close() + # 使用SQLAlchemy 1.4+的select语法 + sel_vid = select(video.c.v_xid, video.c.v_name).where( + tuple_(video.c.v_xid, video.c.v_name).in_(all_vid_keys) + ) + result = conn.execute(sel_vid) + vid_existing_keys = {(row.v_xid, row.v_name) for row in result} + except Exception as e: + logger.error(f"查询视频表时异常: {e}") + try: + cls.push_record_many(payloads) + except Exception as re: + logger.error("[Redis 回退失败]", re) + return + finally: + conn.close() # 设置重复标志 for i, vid_row in enumerate(vid_rows): @@ -834,55 +832,59 @@ class DBSA: # ========== 操作记录表去重 ========== final_op_rows = [] if op_rows: - try: - # 生成所有操作记录索引键 - op_check_keys = [ - (row["rn"], row["name_title"], row["keyword"], row["v_xid"], row["createtime"]) - for row in op_rows - ] + # 生成所有操作记录索引键 + op_check_keys = [ + (row["rn"], row["name_title"], row["keyword"], row["v_xid"], row["createtime"]) + for row in op_rows + ] - # 查询数据库已存在的操作记录 - conn = _engine.connect() - stmt = select([ - video_op.c.rn, - video_op.c.name_title, - video_op.c.keyword, - video_op.c.v_xid, - video_op.c.createtime - ]).where( - tuple_( + if op_check_keys: # 仅当有键时才查询 + try: + # 查询数据库已存在的操作记录 + conn = _engine.connect() + # 使用SQLAlchemy 1.4+的select语法 + stmt = select( video_op.c.rn, video_op.c.name_title, video_op.c.keyword, video_op.c.v_xid, video_op.c.createtime - ).in_(op_check_keys) - ) - result = conn.execute(stmt) - existing_db_op_keys = {tuple(row) for row in result} - conn.close() - except Exception as e: - logger.error(f"查询操作记录表失败: {e}") - try: - cls.push_record_many(payloads) - except Exception as re: - logger.error("Redis退回失败", re) - return + ).where( + tuple_( + video_op.c.rn, + video_op.c.name_title, + video_op.c.keyword, + video_op.c.v_xid, + video_op.c.createtime + ).in_(op_check_keys) + ) + result = conn.execute(stmt) + existing_db_op_keys = {tuple(row) for row in result} + conn.close() + except Exception as e: + logger.error(f"查询操作记录表失败: {e}") + try: + cls.push_record_many(payloads) + except Exception as re: + logger.error("Redis退回失败", re) + return - # 过滤重复操作记录 - for idx, row in enumerate(op_rows): - index_key = ( - row["rn"], - row["name_title"], - row["keyword"], - row["v_xid"], - row["createtime"] - ) + # 过滤重复操作记录 + for idx, row in enumerate(op_rows): + index_key = ( + row["rn"], + row["name_title"], + row["keyword"], + row["v_xid"], + row["createtime"] + ) - # 检查是否在数据库或当前批次中重复 - if index_key not in existing_db_op_keys and index_key not in existing_op_keys_batch: - final_op_rows.append(row) - existing_op_keys_batch.add(index_key) + # 检查是否在数据库或当前批次中重复 + if index_key not in existing_db_op_keys and index_key not in existing_op_keys_batch: + final_op_rows.append(row) + existing_op_keys_batch.add(index_key) + else: + final_op_rows = op_rows[:] # 如果没有键,直接使用所有行 # ========== 作者表处理 ========== authors_map = {}