fix: configure_env 按 (project_id, env_type) upsert + sudo_enabled 归一化 VARCHAR(1)

- 修复反复 INSERT Duplicate entry(1062):先查 (project_id, env_type) 已存在则 UPDATE
- 修复 DataError(1406):'false' 字符串超长,归一化为 'Y'/'N' 单字符
This commit is contained in:
ymq 2026-08-22 11:48:47 +08:00
parent 0af4faff21
commit ea6df9c7c6

View File

@ -102,7 +102,6 @@ async def configure_env(project_id, env_type, host, user, deploy_path,
return False, "缺少 deploy_path"
db, dbname = _get_db()
async with db.sqlorContext(dbname) as sor:
eid = getID()
try:
port = int(port)
except (TypeError, ValueError):
@ -111,15 +110,17 @@ async def configure_env(project_id, env_type, host, user, deploy_path,
db_port = int(db_port)
except (TypeError, ValueError):
db_port = 3306
await sor.C(TABLE, {
'id': eid,
# sudo_enabled 归一化:字段 VARCHAR(1)'false'/'0'/'no'/'n' → 'N''true'/'1'/'yes'/'y' → 'Y'
_se = str(sudo_enabled).strip().lower() if sudo_enabled else ''
se_val = 'Y' if _se in ('1', 'true', 'yes', 'y', '') else 'N'
data = {
'project_id': project_id,
'env_type': env_type.strip(),
'host': host.strip(),
'port': port,
'user': user.strip(),
'ssh_key_path': ssh_key_path or '',
'sudo_enabled': sudo_enabled or '',
'sudo_enabled': se_val,
'deploy_path': deploy_path.strip(),
'python_path': python_path or '',
'db_host': db_host or '',
@ -128,11 +129,24 @@ async def configure_env(project_id, env_type, host, user, deploy_path,
'db_user': db_user or '',
'db_password': db_password or '',
'status': S_CONFIGURED,
})
}
# upsert按 (project_id, env_type) 查已存在UNIQUE 约束),存在则 UPDATE否则 INSERT
existing = await sor.sqlExe(
"SELECT id FROM sd_deploy_envs WHERE project_id=${pid}$ AND env_type=${et}$",
{"pid": project_id, "et": env_type.strip()})
await sor.sqlExe("COMMIT", {})
if existing:
eid = existing[0].id
data['id'] = eid
await sor.U(TABLE, data)
else:
eid = getID()
data['id'] = eid
await sor.C(TABLE, data)
await record_audit(project_id, TABLE, eid, 'configure',
to_state=S_CONFIGURED, who=_normalize_role(who),
agent_id=agent_id, sor=sor)
logger.info("configure_env: %s project=%s type=%s", eid, project_id, env_type.strip())
logger.info("configure_env: %s project=%s type=%s (upsert)", eid, project_id, env_type.strip())
return True, eid