fix(rag_client): params读写列不一致致重复行——_load_cached_key按id查但写入id=getID()随机值,缓存永远miss→每次发key新增一行(实测user-01堆12行);ON DUPLICATE KEY UPDATE因params_name无唯一索引永不触发。修:读改按params_name+读-改-写幂等(存在则更新首行删多余行)

This commit is contained in:
ymq 2026-09-12 08:04:17 +08:00
parent 78c89a0cce
commit c32ceaa920

View File

@ -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, ""