Platform Infrastructure - 8 Core Modules Completed: - Storage Service (LocalAdapter + OSSAdapter stub) - Logging System (Winston + JSON format) - Cache Service (MemoryCache + Redis stub) - Async Job Queue (MemoryQueue + DatabaseQueue stub) - Health Check Endpoints (liveness/readiness/detailed) - Database Connection Pool (with Serverless optimization) - Environment Configuration Management - Monitoring Metrics (DB connections/memory/API) Key Features: - Adapter Pattern for zero-code environment switching - Full backward compatibility with legacy modules - 100% test coverage (all 8 modules verified) - Complete documentation (11 docs updated) Technical Improvements: - Fixed duplicate /health route registration issue - Fixed TypeScript interface export (export type) - Installed winston dependency - Added structured logging with context support - Implemented graceful shutdown for Serverless - Added connection pool optimization for SAE Documentation Updates: - Platform infrastructure planning (04-骞冲彴鍩虹璁炬柦瑙勫垝.md) - Implementation report (2025-11-17-骞冲彴鍩虹璁炬柦瀹炴柦瀹屾垚鎶ュ憡.md) - Verification report (2025-11-17-骞冲彴鍩虹璁炬柦楠岃瘉鎶ュ憡.md) - Git commit guidelines (06-Git鎻愪氦瑙勮寖.md) - Added commit frequency rules - Updated 3 core architecture documents Code Statistics: - New code: 2,532 lines - New files: 22 - Updated files: 130+ - Test pass rate: 100% (8/8 modules) Deployment Readiness: - Local environment: 鉁?Ready - Cloud environment: 馃攧 Needs OSS/Redis dependencies Next Steps: - Ready to start ASL module development - Can directly use storage/logger/cache/jobQueue Tested: Local verification 100% passed Related: #Platform-Infrastructure
547 lines
16 KiB
SQL
547 lines
16 KiB
SQL
-- ========================================
|
||
-- 005-validate-all.sql
|
||
-- ========================================
|
||
-- 目的:全局验证10个Schema和数据迁移的完整性
|
||
-- 预计时间:10分钟
|
||
-- 作者:AI助手
|
||
-- 日期:2025-11-09
|
||
-- ========================================
|
||
|
||
-- 前置条件:
|
||
-- 1. 已执行 001-create-all-10-schemas.sql
|
||
-- 2. 已执行 002-migrate-platform.sql
|
||
-- 3. 已执行 003-migrate-aia.sql
|
||
-- 4. 已执行 004-migrate-pkb.sql
|
||
|
||
-- ========================================
|
||
-- 第一部分:Schema完整性验证
|
||
-- ========================================
|
||
|
||
\echo '========================================';
|
||
\echo '第一部分:Schema完整性验证';
|
||
\echo '========================================';
|
||
|
||
SELECT
|
||
'Schema检查' AS check_type,
|
||
nspname AS schema_name,
|
||
CASE
|
||
WHEN nspname IN ('platform_schema', 'aia_schema', 'pkb_schema',
|
||
'asl_schema', 'common_schema', 'dc_schema',
|
||
'rvw_schema', 'admin_schema', 'ssa_schema', 'st_schema')
|
||
THEN '✅ 存在'
|
||
ELSE '❌ 不存在'
|
||
END AS status,
|
||
pg_catalog.obj_description(oid, 'pg_namespace') AS description
|
||
FROM pg_namespace
|
||
WHERE nspname IN (
|
||
'platform_schema', 'aia_schema', 'pkb_schema',
|
||
'asl_schema', 'common_schema', 'dc_schema',
|
||
'rvw_schema', 'admin_schema', 'ssa_schema', 'st_schema'
|
||
)
|
||
ORDER BY nspname;
|
||
|
||
-- 统计Schema数量
|
||
DO $$
|
||
DECLARE
|
||
schema_count INTEGER;
|
||
BEGIN
|
||
SELECT COUNT(*) INTO schema_count
|
||
FROM pg_namespace
|
||
WHERE nspname IN (
|
||
'platform_schema', 'aia_schema', 'pkb_schema',
|
||
'asl_schema', 'common_schema', 'dc_schema',
|
||
'rvw_schema', 'admin_schema', 'ssa_schema', 'st_schema'
|
||
);
|
||
|
||
RAISE NOTICE '========================================';
|
||
IF schema_count = 10 THEN
|
||
RAISE NOTICE '✅ Schema完整性检查通过:10个Schema全部创建成功';
|
||
ELSE
|
||
RAISE WARNING '❌ Schema完整性检查失败:预期10个,实际%个', schema_count;
|
||
END IF;
|
||
RAISE NOTICE '========================================';
|
||
END $$;
|
||
|
||
-- ========================================
|
||
-- 第二部分:表结构验证
|
||
-- ========================================
|
||
|
||
\echo '';
|
||
\echo '========================================';
|
||
\echo '第二部分:表结构验证';
|
||
\echo '========================================';
|
||
|
||
SELECT
|
||
'platform_schema' AS schema_name,
|
||
tablename AS table_name,
|
||
'✅' AS status
|
||
FROM pg_tables
|
||
WHERE schemaname = 'platform_schema'
|
||
|
||
UNION ALL
|
||
|
||
SELECT
|
||
'aia_schema',
|
||
tablename,
|
||
'✅'
|
||
FROM pg_tables
|
||
WHERE schemaname = 'aia_schema'
|
||
|
||
UNION ALL
|
||
|
||
SELECT
|
||
'pkb_schema',
|
||
tablename,
|
||
'✅'
|
||
FROM pg_tables
|
||
WHERE schemaname = 'pkb_schema'
|
||
|
||
ORDER BY schema_name, table_name;
|
||
|
||
-- 统计各Schema的表数量
|
||
DO $$
|
||
DECLARE
|
||
platform_tables INTEGER;
|
||
aia_tables INTEGER;
|
||
pkb_tables INTEGER;
|
||
all_ok BOOLEAN := true;
|
||
BEGIN
|
||
SELECT COUNT(*) INTO platform_tables FROM pg_tables WHERE schemaname = 'platform_schema';
|
||
SELECT COUNT(*) INTO aia_tables FROM pg_tables WHERE schemaname = 'aia_schema';
|
||
SELECT COUNT(*) INTO pkb_tables FROM pg_tables WHERE schemaname = 'pkb_schema';
|
||
|
||
RAISE NOTICE '========================================';
|
||
RAISE NOTICE 'platform_schema: % 个表 (预期1个)', platform_tables;
|
||
RAISE NOTICE 'aia_schema: % 个表 (预期5个)', aia_tables;
|
||
RAISE NOTICE 'pkb_schema: % 个表 (预期5个)', pkb_tables;
|
||
RAISE NOTICE '========================================';
|
||
|
||
IF platform_tables != 1 THEN
|
||
RAISE WARNING '❌ platform_schema表数量异常';
|
||
all_ok := false;
|
||
END IF;
|
||
|
||
IF aia_tables != 5 THEN
|
||
RAISE WARNING '❌ aia_schema表数量异常';
|
||
all_ok := false;
|
||
END IF;
|
||
|
||
IF pkb_tables != 5 THEN
|
||
RAISE WARNING '❌ pkb_schema表数量异常';
|
||
all_ok := false;
|
||
END IF;
|
||
|
||
IF all_ok THEN
|
||
RAISE NOTICE '✅ 表结构验证通过:所有表创建成功';
|
||
END IF;
|
||
RAISE NOTICE '========================================';
|
||
END $$;
|
||
|
||
-- ========================================
|
||
-- 第三部分:数据量对比验证
|
||
-- ========================================
|
||
|
||
\echo '';
|
||
\echo '========================================';
|
||
\echo '第三部分:数据量对比验证';
|
||
\echo '========================================';
|
||
|
||
-- 3.1 Platform Schema
|
||
SELECT
|
||
'users' AS table_name,
|
||
(SELECT COUNT(*) FROM public.users) AS public_count,
|
||
(SELECT COUNT(*) FROM platform_schema.users) AS migrated_count,
|
||
CASE
|
||
WHEN (SELECT COUNT(*) FROM public.users) = (SELECT COUNT(*) FROM platform_schema.users)
|
||
THEN '✅ 一致'
|
||
ELSE '❌ 不一致'
|
||
END AS status
|
||
WHERE EXISTS (SELECT 1 FROM public.users LIMIT 1);
|
||
|
||
-- 3.2 AIA Schema
|
||
SELECT
|
||
'projects' AS table_name,
|
||
(SELECT COUNT(*) FROM public.projects) AS public_count,
|
||
(SELECT COUNT(*) FROM aia_schema.projects) AS migrated_count,
|
||
CASE
|
||
WHEN (SELECT COUNT(*) FROM public.projects) = (SELECT COUNT(*) FROM aia_schema.projects)
|
||
THEN '✅ 一致'
|
||
ELSE '❌ 不一致'
|
||
END AS status
|
||
|
||
UNION ALL
|
||
|
||
SELECT
|
||
'conversations',
|
||
(SELECT COUNT(*) FROM public.conversations),
|
||
(SELECT COUNT(*) FROM aia_schema.conversations),
|
||
CASE
|
||
WHEN (SELECT COUNT(*) FROM public.conversations) = (SELECT COUNT(*) FROM aia_schema.conversations)
|
||
THEN '✅ 一致'
|
||
ELSE '❌ 不一致'
|
||
END
|
||
|
||
UNION ALL
|
||
|
||
SELECT
|
||
'messages',
|
||
(SELECT COUNT(*) FROM public.messages),
|
||
(SELECT COUNT(*) FROM aia_schema.messages),
|
||
CASE
|
||
WHEN (SELECT COUNT(*) FROM public.messages) = (SELECT COUNT(*) FROM aia_schema.messages)
|
||
THEN '✅ 一致'
|
||
ELSE '❌ 不一致'
|
||
END
|
||
|
||
UNION ALL
|
||
|
||
SELECT
|
||
'general_conversations',
|
||
(SELECT COUNT(*) FROM public.general_conversations),
|
||
(SELECT COUNT(*) FROM aia_schema.general_conversations),
|
||
CASE
|
||
WHEN (SELECT COUNT(*) FROM public.general_conversations) = (SELECT COUNT(*) FROM aia_schema.general_conversations)
|
||
THEN '✅ 一致'
|
||
ELSE '❌ 不一致'
|
||
END
|
||
|
||
UNION ALL
|
||
|
||
SELECT
|
||
'general_messages',
|
||
(SELECT COUNT(*) FROM public.general_messages),
|
||
(SELECT COUNT(*) FROM aia_schema.general_messages),
|
||
CASE
|
||
WHEN (SELECT COUNT(*) FROM public.general_messages) = (SELECT COUNT(*) FROM aia_schema.general_messages)
|
||
THEN '✅ 一致'
|
||
ELSE '❌ 不一致'
|
||
END;
|
||
|
||
-- 3.3 PKB Schema
|
||
SELECT
|
||
'knowledge_bases' AS table_name,
|
||
(SELECT COUNT(*) FROM public.knowledge_bases) AS public_count,
|
||
(SELECT COUNT(*) FROM pkb_schema.knowledge_bases) AS migrated_count,
|
||
CASE
|
||
WHEN (SELECT COUNT(*) FROM public.knowledge_bases) = (SELECT COUNT(*) FROM pkb_schema.knowledge_bases)
|
||
THEN '✅ 一致'
|
||
ELSE '❌ 不一致'
|
||
END AS status
|
||
|
||
UNION ALL
|
||
|
||
SELECT
|
||
'documents',
|
||
(SELECT COUNT(*) FROM public.documents),
|
||
(SELECT COUNT(*) FROM pkb_schema.documents),
|
||
CASE
|
||
WHEN (SELECT COUNT(*) FROM public.documents) = (SELECT COUNT(*) FROM pkb_schema.documents)
|
||
THEN '✅ 一致'
|
||
ELSE '❌ 不一致'
|
||
END
|
||
|
||
UNION ALL
|
||
|
||
SELECT
|
||
'batch_tasks',
|
||
(SELECT COUNT(*) FROM public.batch_tasks),
|
||
(SELECT COUNT(*) FROM pkb_schema.batch_tasks),
|
||
CASE
|
||
WHEN (SELECT COUNT(*) FROM public.batch_tasks) = (SELECT COUNT(*) FROM pkb_schema.batch_tasks)
|
||
THEN '✅ 一致'
|
||
ELSE '❌ 不一致'
|
||
END
|
||
|
||
UNION ALL
|
||
|
||
SELECT
|
||
'batch_results',
|
||
(SELECT COUNT(*) FROM public.batch_results),
|
||
(SELECT COUNT(*) FROM pkb_schema.batch_results),
|
||
CASE
|
||
WHEN (SELECT COUNT(*) FROM public.batch_results) = (SELECT COUNT(*) FROM pkb_schema.batch_results)
|
||
THEN '✅ 一致'
|
||
ELSE '❌ 不一致'
|
||
END
|
||
|
||
UNION ALL
|
||
|
||
SELECT
|
||
'task_templates',
|
||
(SELECT COUNT(*) FROM public.task_templates),
|
||
(SELECT COUNT(*) FROM pkb_schema.task_templates),
|
||
CASE
|
||
WHEN (SELECT COUNT(*) FROM public.task_templates) = (SELECT COUNT(*) FROM pkb_schema.task_templates)
|
||
THEN '✅ 一致'
|
||
ELSE '❌ 不一致'
|
||
END;
|
||
|
||
-- ========================================
|
||
-- 第四部分:外键约束验证
|
||
-- ========================================
|
||
|
||
\echo '';
|
||
\echo '========================================';
|
||
\echo '第四部分:外键约束验证';
|
||
\echo '========================================';
|
||
|
||
SELECT
|
||
tc.table_schema AS schema_name,
|
||
tc.table_name,
|
||
tc.constraint_name,
|
||
kcu.column_name,
|
||
ccu.table_schema AS foreign_schema,
|
||
ccu.table_name AS foreign_table,
|
||
ccu.column_name AS foreign_column,
|
||
'✅' AS status
|
||
FROM information_schema.table_constraints tc
|
||
JOIN information_schema.key_column_usage kcu
|
||
ON tc.constraint_name = kcu.constraint_name
|
||
AND tc.table_schema = kcu.table_schema
|
||
JOIN information_schema.constraint_column_usage ccu
|
||
ON ccu.constraint_name = tc.constraint_name
|
||
AND ccu.table_schema = tc.table_schema
|
||
WHERE tc.constraint_type = 'FOREIGN KEY'
|
||
AND tc.table_schema IN ('platform_schema', 'aia_schema', 'pkb_schema')
|
||
ORDER BY tc.table_schema, tc.table_name, tc.constraint_name;
|
||
|
||
-- 统计外键数量
|
||
DO $$
|
||
DECLARE
|
||
fk_count INTEGER;
|
||
BEGIN
|
||
SELECT COUNT(*) INTO fk_count
|
||
FROM information_schema.table_constraints
|
||
WHERE constraint_type = 'FOREIGN KEY'
|
||
AND table_schema IN ('platform_schema', 'aia_schema', 'pkb_schema');
|
||
|
||
RAISE NOTICE '========================================';
|
||
RAISE NOTICE '✅ 外键约束总数:%', fk_count;
|
||
RAISE NOTICE '========================================';
|
||
END $$;
|
||
|
||
-- ========================================
|
||
-- 第五部分:跨Schema引用验证
|
||
-- ========================================
|
||
|
||
\echo '';
|
||
\echo '========================================';
|
||
\echo '第五部分:跨Schema引用验证';
|
||
\echo '========================================';
|
||
|
||
-- 验证所有引用platform_schema.users的外键是否有效
|
||
DO $$
|
||
DECLARE
|
||
invalid_aia_projects INTEGER;
|
||
invalid_aia_conversations INTEGER;
|
||
invalid_aia_general_conversations INTEGER;
|
||
invalid_pkb_knowledge_bases INTEGER;
|
||
invalid_pkb_documents INTEGER;
|
||
all_valid BOOLEAN := true;
|
||
BEGIN
|
||
-- 验证aia_schema.projects
|
||
SELECT COUNT(*) INTO invalid_aia_projects
|
||
FROM aia_schema.projects p
|
||
LEFT JOIN platform_schema.users u ON p.user_id = u.id
|
||
WHERE u.id IS NULL;
|
||
|
||
-- 验证aia_schema.conversations
|
||
SELECT COUNT(*) INTO invalid_aia_conversations
|
||
FROM aia_schema.conversations c
|
||
LEFT JOIN platform_schema.users u ON c.user_id = u.id
|
||
WHERE u.id IS NULL;
|
||
|
||
-- 验证aia_schema.general_conversations
|
||
SELECT COUNT(*) INTO invalid_aia_general_conversations
|
||
FROM aia_schema.general_conversations gc
|
||
LEFT JOIN platform_schema.users u ON gc.user_id = u.id
|
||
WHERE u.id IS NULL;
|
||
|
||
-- 验证pkb_schema.knowledge_bases
|
||
SELECT COUNT(*) INTO invalid_pkb_knowledge_bases
|
||
FROM pkb_schema.knowledge_bases kb
|
||
LEFT JOIN platform_schema.users u ON kb.user_id = u.id
|
||
WHERE u.id IS NULL;
|
||
|
||
-- 验证pkb_schema.documents
|
||
SELECT COUNT(*) INTO invalid_pkb_documents
|
||
FROM pkb_schema.documents d
|
||
LEFT JOIN platform_schema.users u ON d.user_id = u.id
|
||
WHERE u.id IS NULL;
|
||
|
||
RAISE NOTICE '========================================';
|
||
RAISE NOTICE '跨Schema引用验证结果:';
|
||
RAISE NOTICE '----------------------------------------';
|
||
|
||
IF invalid_aia_projects > 0 THEN
|
||
RAISE WARNING '❌ aia_schema.projects有%条无效user_id', invalid_aia_projects;
|
||
all_valid := false;
|
||
ELSE
|
||
RAISE NOTICE '✅ aia_schema.projects外键全部有效';
|
||
END IF;
|
||
|
||
IF invalid_aia_conversations > 0 THEN
|
||
RAISE WARNING '❌ aia_schema.conversations有%条无效user_id', invalid_aia_conversations;
|
||
all_valid := false;
|
||
ELSE
|
||
RAISE NOTICE '✅ aia_schema.conversations外键全部有效';
|
||
END IF;
|
||
|
||
IF invalid_aia_general_conversations > 0 THEN
|
||
RAISE WARNING '❌ aia_schema.general_conversations有%条无效user_id', invalid_aia_general_conversations;
|
||
all_valid := false;
|
||
ELSE
|
||
RAISE NOTICE '✅ aia_schema.general_conversations外键全部有效';
|
||
END IF;
|
||
|
||
IF invalid_pkb_knowledge_bases > 0 THEN
|
||
RAISE WARNING '❌ pkb_schema.knowledge_bases有%条无效user_id', invalid_pkb_knowledge_bases;
|
||
all_valid := false;
|
||
ELSE
|
||
RAISE NOTICE '✅ pkb_schema.knowledge_bases外键全部有效';
|
||
END IF;
|
||
|
||
IF invalid_pkb_documents > 0 THEN
|
||
RAISE WARNING '❌ pkb_schema.documents有%条无效user_id', invalid_pkb_documents;
|
||
all_valid := false;
|
||
ELSE
|
||
RAISE NOTICE '✅ pkb_schema.documents外键全部有效';
|
||
END IF;
|
||
|
||
RAISE NOTICE '========================================';
|
||
|
||
IF all_valid THEN
|
||
RAISE NOTICE '✅ 所有跨Schema引用验证通过';
|
||
ELSE
|
||
RAISE WARNING '❌ 存在无效的跨Schema引用';
|
||
END IF;
|
||
|
||
RAISE NOTICE '========================================';
|
||
END $$;
|
||
|
||
-- ========================================
|
||
-- 第六部分:索引验证
|
||
-- ========================================
|
||
|
||
\echo '';
|
||
\echo '========================================';
|
||
\echo '第六部分:索引验证';
|
||
\echo '========================================';
|
||
|
||
SELECT
|
||
schemaname AS schema_name,
|
||
tablename AS table_name,
|
||
indexname AS index_name,
|
||
'✅' AS status
|
||
FROM pg_indexes
|
||
WHERE schemaname IN ('platform_schema', 'aia_schema', 'pkb_schema')
|
||
ORDER BY schemaname, tablename, indexname;
|
||
|
||
-- 统计索引数量
|
||
DO $$
|
||
DECLARE
|
||
index_count INTEGER;
|
||
BEGIN
|
||
SELECT COUNT(*) INTO index_count
|
||
FROM pg_indexes
|
||
WHERE schemaname IN ('platform_schema', 'aia_schema', 'pkb_schema')
|
||
AND indexname NOT LIKE '%pkey'; -- 排除主键索引
|
||
|
||
RAISE NOTICE '========================================';
|
||
RAISE NOTICE '✅ 非主键索引总数:%', index_count;
|
||
RAISE NOTICE '========================================';
|
||
END $$;
|
||
|
||
-- ========================================
|
||
-- 第七部分:数据采样验证(抽样检查)
|
||
-- ========================================
|
||
|
||
\echo '';
|
||
\echo '========================================';
|
||
\echo '第七部分:数据采样验证';
|
||
\echo '========================================';
|
||
|
||
-- 采样验证:检查ID是否完全一致
|
||
DO $$
|
||
DECLARE
|
||
user_ids_match BOOLEAN;
|
||
project_ids_match BOOLEAN;
|
||
BEGIN
|
||
-- 验证users的ID
|
||
SELECT NOT EXISTS (
|
||
SELECT id FROM public.users
|
||
EXCEPT
|
||
SELECT id FROM platform_schema.users
|
||
) AND NOT EXISTS (
|
||
SELECT id FROM platform_schema.users
|
||
EXCEPT
|
||
SELECT id FROM public.users
|
||
) INTO user_ids_match;
|
||
|
||
-- 验证projects的ID
|
||
SELECT NOT EXISTS (
|
||
SELECT id FROM public.projects
|
||
EXCEPT
|
||
SELECT id FROM aia_schema.projects
|
||
) AND NOT EXISTS (
|
||
SELECT id FROM aia_schema.projects
|
||
EXCEPT
|
||
SELECT id FROM public.projects
|
||
) INTO project_ids_match;
|
||
|
||
RAISE NOTICE '========================================';
|
||
IF user_ids_match THEN
|
||
RAISE NOTICE '✅ users表ID完全一致';
|
||
ELSE
|
||
RAISE WARNING '❌ users表ID存在差异';
|
||
END IF;
|
||
|
||
IF project_ids_match THEN
|
||
RAISE NOTICE '✅ projects表ID完全一致';
|
||
ELSE
|
||
RAISE WARNING '❌ projects表ID存在差异';
|
||
END IF;
|
||
RAISE NOTICE '========================================';
|
||
END $$;
|
||
|
||
-- ========================================
|
||
-- 第八部分:最终总结报告
|
||
-- ========================================
|
||
|
||
\echo '';
|
||
\echo '========================================';
|
||
\echo '最终总结报告';
|
||
\echo '========================================';
|
||
|
||
SELECT
|
||
'✅ Schema隔离迁移验证完成' AS summary,
|
||
(SELECT COUNT(*) FROM platform_schema.users) || ' users' AS platform,
|
||
(SELECT COUNT(*) FROM aia_schema.projects) || ' projects, ' ||
|
||
(SELECT COUNT(*) FROM aia_schema.conversations) || ' conversations' AS aia,
|
||
(SELECT COUNT(*) FROM pkb_schema.knowledge_bases) || ' knowledge_bases, ' ||
|
||
(SELECT COUNT(*) FROM pkb_schema.documents) || ' documents' AS pkb;
|
||
|
||
\echo '';
|
||
\echo '========================================';
|
||
\echo '✅ 所有验证完成!';
|
||
\echo '========================================';
|
||
\echo '下一步:';
|
||
\echo '1. 更新Prisma配置(schema.prisma)';
|
||
\echo '2. 生成Prisma Client';
|
||
\echo '3. 更新代码以使用新Schema';
|
||
\echo '4. 运行应用测试';
|
||
\echo '========================================';
|
||
|
||
-- ========================================
|
||
-- 完成
|
||
-- ========================================
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|