From a9d14cb20eeeadecd5ccf0e81511d9194b3858e8 Mon Sep 17 00:00:00 2001 From: Pine Date: Mon, 24 Aug 2026 20:19:02 +0800 Subject: [PATCH] =?UTF-8?q?fix(db):=20=E7=A7=8D=E5=AD=90=E6=99=BA=E8=83=BD?= =?UTF-8?q?=E4=BD=93=E5=BD=BB=E5=BA=95=E5=B9=82=E7=AD=89=20=E2=80=94=20INS?= =?UTF-8?q?ERT=20OR=20IGNORE(=E5=A4=8D=E5=90=88=E5=94=AF=E4=B8=80)=20+=20p?= =?UTF-8?q?ort=20=E9=BB=98=E8=AE=A4=20''?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit -add_agent 改用 SQLite on_conflict_do_nothing((id,user_id,port)),杜绝运行时/重跑 UNIQUE; port 无端口身份默认 ''(agents.port NOT NULL)。真实库 migrate+seed 连续 3 次均成功。 --- app/infrastructure/seed.py | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/app/infrastructure/seed.py b/app/infrastructure/seed.py index 571a5b0..0bdc2df 100644 --- a/app/infrastructure/seed.py +++ b/app/infrastructure/seed.py @@ -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: