refactor(deploy): v2 运行时表(pipeline_user_memory/sd_deploy_accounts/sd_work_envs)+列迁移(agent_config/retry_count/last_error)从启动期迁到 create_tables.py 部署期,运行期不做 schema 变更

This commit is contained in:
yumoqing 2026-08-18 16:02:18 +08:00
parent 72a362c96e
commit 4f8aff467f

View File

@ -61,6 +61,69 @@ CREATE TABLE IF NOT EXISTS sd_features (
) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci engine=innodb comment '功能/需求表';
"""
# pipeline-service v2 运行时表(原 init.py::_init_v2_tables 启动时建,现迁到部署期)。
# 手写幂等 DDL避开 json2ddl 的 DEFAULT ''N'' bug索引内联避免重复建 Duplicate key name。
# 铁律:运行期不做任何 schema 变更DB 全部变化必须在部署期build.sh → create_tables.py完成。
_V2_RUNTIME_TABLES = [
"""
CREATE TABLE IF NOT EXISTS pipeline_user_memory (
`id` varchar(32) NOT NULL,
`memory_key` varchar(64) NOT NULL,
`content` text NOT NULL,
`category` varchar(32) NOT NULL DEFAULT 'memory',
`scope` varchar(32) NOT NULL DEFAULT 'global',
`scope_id` varchar(64) NOT NULL DEFAULT '',
`priority` int(11) NOT NULL DEFAULT 0,
`access_count` int(11) NOT NULL DEFAULT 0,
`created_at` datetime NOT NULL DEFAULT current_timestamp(),
`updated_at` datetime NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
PRIMARY KEY (`id`),
UNIQUE KEY `uk_memory` (`memory_key`,`category`),
KEY `idx_category_priority` (`category`,`priority`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
""",
"""
CREATE TABLE IF NOT EXISTS sd_deploy_accounts (
`id` varchar(32) NOT NULL,
`user_id` varchar(32) NOT NULL,
`account_name` varchar(64) NOT NULL,
`deploy_dir` varchar(500) NOT NULL,
`status` varchar(20) NOT NULL DEFAULT 'active',
`sandbox_config` text,
`created_at` datetime NOT NULL DEFAULT current_timestamp(),
`updated_at` datetime NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
PRIMARY KEY (`id`),
UNIQUE KEY `uk_account_name` (`account_name`),
UNIQUE KEY `uk_user_id` (`user_id`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
""",
"""
CREATE TABLE IF NOT EXISTS sd_work_envs (
`id` varchar(32) NOT NULL,
`owner_type` varchar(10) NOT NULL,
`owner_id` varchar(32) NOT NULL,
`mode` varchar(10) NOT NULL DEFAULT 'local',
`remote_host` varchar(200),
`remote_port` int(11) DEFAULT 22,
`remote_user` varchar(100),
`remote_key_path` varchar(500),
`remote_dir` varchar(500),
`created_at` datetime NOT NULL DEFAULT current_timestamp(),
`updated_at` datetime NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
PRIMARY KEY (`id`),
UNIQUE KEY `uk_owner` (`owner_type`,`owner_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
""",
]
# v2 引擎列迁移(原 init.py::_init_v2_tables 启动时 ALTER 迁移现迁到部署期information_schema 幂等)
_V2_COLUMNS = {
"pipelines": {"agent_config": "text"},
"sd_org_settings": {"agent_config": "text"},
"pipeline_tasks": {"retry_count": "int NOT NULL DEFAULT 0", "last_error": "text"},
}
def split_ddl(ddl):
"""按分号分割 DDL跳过注释行和空语句。"""
@ -171,6 +234,29 @@ async def main():
except Exception as e:
print(f' WARN: sd_features ensure failed: {e}')
# pipeline-service v2 运行时表(原启动时建,现迁到部署期幂等建表)
try:
for ddl in _V2_RUNTIME_TABLES:
await sor.execute(ddl, {})
print(' tables: pipeline-service v2 runtime tables ensured (pipeline_user_memory/sd_deploy_accounts/sd_work_envs)')
except Exception as e:
print(f' WARN: v2 runtime tables ensure failed: {e}')
# v2 引擎列迁移(原启动时 ALTER现迁到部署期information_schema 查列存在性幂等)
try:
for tbl, cols in _V2_COLUMNS.items():
for col, ddl in cols.items():
r = await sor.sqlExe(
"SELECT COUNT(*) as c FROM information_schema.COLUMNS "
"WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME=${tbl}$ "
"AND COLUMN_NAME=${col}$", {"tbl": tbl, "col": col})
await sor.sqlExe("COMMIT", {})
if not r or getattr(r[0], 'c', 0) == 0:
await sor.execute(f"ALTER TABLE {tbl} ADD COLUMN {col} {ddl}", {})
print(' migrate: v2 engine columns ensured (agent_config/retry_count/last_error)')
except Exception as e:
print(f' WARN: v2 engine column migrate failed: {e}')
if __name__ == '__main__':
asyncio.run(main())