diff --git a/pipeline_service/rag_client.py b/pipeline_service/rag_client.py index fbd45d9..767e8c4 100644 --- a/pipeline_service/rag_client.py +++ b/pipeline_service/rag_client.py @@ -119,7 +119,7 @@ async def _ensure_downapp(sor): async def _load_cached_key(sor, user_id): pname = _KEY_PARAM_PREFIX + str(user_id) recs = await sor.sqlExe( - "SELECT params_value FROM params WHERE id=${n}$", {"n": pname}) + "SELECT params_value FROM params WHERE params_name=${n}$ LIMIT 1", {"n": pname}) await sor.sqlExe("COMMIT", {}) if not recs: return "" @@ -160,10 +160,25 @@ async def get_owner_apikey(owner_id): # RC4 加密存 params(与平台密码字段约定一致) pname = _KEY_PARAM_PREFIX + str(owner_id) enc = _key_encode(key) - await sor.sqlExe( - "INSERT INTO params (id, params_name, params_value) VALUES (${i}$, ${n}$, ${v}$) " - "ON DUPLICATE KEY UPDATE params_value=${v}$", - {"i": getID(), "n": pname, "v": enc}) + # 幂等按 params_name 读-改-写:params 表 params_name 无唯一索引, + # 不能用 INSERT...ON DUPLICATE KEY UPDATE(永不触发→重复插行)。 + # 旧 bug:_load_cached_key 按 id 查、这里按 getID() 随机 id 写,缓存永远 miss + # →每次发 key 都新增一行(实测 user-01 堆了 12 行)。2026-09-12 修。 + exists = await sor.sqlExe( + "SELECT id FROM params WHERE params_name=${n}$ ORDER BY id LIMIT 1", {"n": pname}) + await sor.sqlExe("COMMIT", {}) + if exists: + # 收敛历史重复行:更新首行,删多余行 + await sor.sqlExe( + "UPDATE params SET params_value=${v}$ WHERE id=${i}$", + {"v": enc, "i": exists[0].id}) + await sor.sqlExe( + "DELETE FROM params WHERE params_name=${n}$ AND id<>${i}$", + {"n": pname, "i": exists[0].id}) + else: + await sor.sqlExe( + "INSERT INTO params (id, params_name, params_value) VALUES (${i}$, ${n}$, ${v}$)", + {"i": getID(), "n": pname, "v": enc}) await sor.sqlExe("COMMIT", {}) _key_cache[owner_id] = key return key, ""