Files
AIclinicalresearch/docs/09-架构实施/migration-scripts/005-validate-all.sql
HaHafeng e3e7e028e8 feat(platform): Complete platform infrastructure implementation and verification
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
2025-11-18 08:00:41 +08:00

547 lines
16 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
-- ========================================
-- 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 '========================================';
-- ========================================
-- 完成
-- ========================================