fix(db): 种子智能体彻底幂等 — INSERT OR IGNORE(复合唯一) + port 默认 ''

-add_agent 改用 SQLite on_conflict_do_nothing((id,user_id,port)),杜绝运行时/重跑 UNIQUE;
port 无端口身份默认 ''(agents.port NOT NULL)。真实库 migrate+seed 连续 3 次均成功。
This commit is contained in:
Pine
2026-08-24 20:19:02 +08:00
parent b6315f69b0
commit a9d14cb20e
+10 -11
View File
@@ -256,17 +256,16 @@ DEMO_USERS = [
async def _add_agent(session: AsyncSession, seed: dict, user_id: str, port: str | None, now: str) -> None:
"""幂等播种单个智能体:按 (id,user_id,port) 已存在则跳过(修全局固定 id 多用户/端口填重)"""
key = (seed["id"], user_id, port)
if await session.get(Agent, key) is not None:
return
session.add(
Agent(id=seed["id"], user_id=user_id, port=port, name=seed["name"],
description=seed["description"], language=seed.get("language", "zh"),
model_name=seed.get("model_name", ""), deletable=seed.get("deletable", True),
use_fixed_soul=seed.get("use_fixed_soul", False),
created_at=now, updated_at=now)
)
"""幂等播种单个智能体:SQLite INSERT OR IGNORE(id,user_id,port) 冲突跳过),杜绝 UNIQUE 抛错"""
from sqlalchemy.dialects.sqlite import insert as sqlite_insert
port_val = port or "" # agents.port NOT NULL;无端口身份用 ""
stmt = sqlite_insert(Agent).values(
id=seed["id"], user_id=user_id, port=port_val, name=seed["name"],
description=seed["description"], language=seed.get("language", "zh"),
model_name=seed.get("model_name", ""), deletable=seed.get("deletable", True),
use_fixed_soul=seed.get("use_fixed_soul", False), created_at=now, updated_at=now,
).on_conflict_do_nothing(index_elements=["id", "user_id", "port"])
await session.execute(stmt)
async def seed_data(session: AsyncSession) -> None: