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:
+10
-11
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user