- Implement 5 core API endpoints (create task, get progress, get results, update decision, export Excel) - Add FulltextScreeningController with Zod validation (652 lines) - Implement ExcelExporter service with 4-sheet report generation (352 lines) - Register routes under /api/v1/asl/fulltext-screening - Create 31 REST Client test cases - Add automated integration test script - Fix PDF extraction fallback mechanism in LLM12FieldsService - Update API design documentation to v3.0 - Update development plan to v1.2 - Create Day 5 development record - Clean up temporary test files
339 lines
8.8 KiB
SQL
339 lines
8.8 KiB
SQL
-- ========================================
|
||
-- 数据库迁移验证脚本
|
||
-- 全面检查10个Schema和数据完整性
|
||
-- ========================================
|
||
|
||
\echo ''
|
||
\echo '========================================'
|
||
\echo '📊 数据库迁移验证报告'
|
||
\echo '========================================'
|
||
\echo ''
|
||
|
||
-- ========================================
|
||
-- 1. Schema检查
|
||
-- ========================================
|
||
\echo '1️⃣ Schema检查'
|
||
\echo '----------------------------------------'
|
||
|
||
SELECT
|
||
schema_name,
|
||
pg_catalog.obj_description(oid, 'pg_namespace') AS description,
|
||
(SELECT COUNT(*) FROM information_schema.tables WHERE table_schema = s.schema_name) as table_count
|
||
FROM pg_namespace s
|
||
WHERE schema_name IN (
|
||
'platform_schema', 'aia_schema', 'pkb_schema',
|
||
'asl_schema', 'common_schema', 'dc_schema',
|
||
'rvw_schema', 'admin_schema', 'ssa_schema', 'st_schema'
|
||
)
|
||
ORDER BY schema_name;
|
||
|
||
\echo ''
|
||
|
||
-- ========================================
|
||
-- 2. 详细表清单
|
||
-- ========================================
|
||
\echo '2️⃣ 详细表清单'
|
||
\echo '----------------------------------------'
|
||
|
||
-- Platform Schema
|
||
\echo '【Platform Schema】'
|
||
SELECT
|
||
schemaname,
|
||
tablename,
|
||
(SELECT COUNT(*) FROM pg_indexes WHERE schemaname = t.schemaname AND tablename = t.tablename) as index_count
|
||
FROM pg_tables t
|
||
WHERE schemaname = 'platform_schema'
|
||
ORDER BY tablename;
|
||
|
||
\echo ''
|
||
|
||
-- AIA Schema
|
||
\echo '【AIA Schema】'
|
||
SELECT
|
||
schemaname,
|
||
tablename,
|
||
(SELECT COUNT(*) FROM pg_indexes WHERE schemaname = t.schemaname AND tablename = t.tablename) as index_count
|
||
FROM pg_tables t
|
||
WHERE schemaname = 'aia_schema'
|
||
ORDER BY tablename;
|
||
|
||
\echo ''
|
||
|
||
-- PKB Schema
|
||
\echo '【PKB Schema】'
|
||
SELECT
|
||
schemaname,
|
||
tablename,
|
||
(SELECT COUNT(*) FROM pg_indexes WHERE schemaname = t.schemaname AND tablename = t.tablename) as index_count
|
||
FROM pg_tables t
|
||
WHERE schemaname = 'pkb_schema'
|
||
ORDER BY tablename;
|
||
|
||
\echo ''
|
||
|
||
-- ========================================
|
||
-- 3. 数据量统计
|
||
-- ========================================
|
||
\echo '3️⃣ 数据量统计'
|
||
\echo '----------------------------------------'
|
||
|
||
-- Platform Schema
|
||
\echo '【Platform Schema】'
|
||
SELECT 'users' AS table_name, COUNT(*) AS row_count FROM platform_schema.users;
|
||
|
||
\echo ''
|
||
|
||
-- AIA Schema
|
||
\echo '【AIA Schema】'
|
||
SELECT 'projects' AS table_name, COUNT(*) AS row_count FROM aia_schema.projects
|
||
UNION ALL
|
||
SELECT 'conversations', COUNT(*) FROM aia_schema.conversations
|
||
UNION ALL
|
||
SELECT 'messages', COUNT(*) FROM aia_schema.messages
|
||
UNION ALL
|
||
SELECT 'general_conversations', COUNT(*) FROM aia_schema.general_conversations
|
||
UNION ALL
|
||
SELECT 'general_messages', COUNT(*) FROM aia_schema.general_messages;
|
||
|
||
\echo ''
|
||
|
||
-- PKB Schema
|
||
\echo '【PKB Schema】'
|
||
SELECT 'knowledge_bases' AS table_name, COUNT(*) AS row_count FROM pkb_schema.knowledge_bases
|
||
UNION ALL
|
||
SELECT 'documents', COUNT(*) FROM pkb_schema.documents
|
||
UNION ALL
|
||
SELECT 'batch_tasks', COUNT(*) FROM pkb_schema.batch_tasks
|
||
UNION ALL
|
||
SELECT 'batch_results', COUNT(*) FROM pkb_schema.batch_results
|
||
UNION ALL
|
||
SELECT 'task_templates', COUNT(*) FROM pkb_schema.task_templates;
|
||
|
||
\echo ''
|
||
|
||
-- ========================================
|
||
-- 4. 数据完整性对比(新Schema vs public)
|
||
-- ========================================
|
||
\echo '4️⃣ 数据完整性对比'
|
||
\echo '----------------------------------------'
|
||
|
||
SELECT
|
||
'users' AS table_name,
|
||
(SELECT COUNT(*) FROM public.users) AS public_count,
|
||
(SELECT COUNT(*) FROM platform_schema.users) AS new_schema_count,
|
||
CASE
|
||
WHEN (SELECT COUNT(*) FROM public.users) = (SELECT COUNT(*) FROM platform_schema.users)
|
||
THEN '✅ 一致'
|
||
ELSE '❌ 不一致'
|
||
END AS status
|
||
|
||
UNION ALL
|
||
|
||
SELECT
|
||
'projects',
|
||
(SELECT COUNT(*) FROM public.projects),
|
||
(SELECT COUNT(*) FROM aia_schema.projects),
|
||
CASE
|
||
WHEN (SELECT COUNT(*) FROM public.projects) = (SELECT COUNT(*) FROM aia_schema.projects)
|
||
THEN '✅ 一致'
|
||
ELSE '❌ 不一致'
|
||
END
|
||
|
||
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
|
||
'knowledge_bases',
|
||
(SELECT COUNT(*) FROM public.knowledge_bases),
|
||
(SELECT COUNT(*) FROM pkb_schema.knowledge_bases),
|
||
CASE
|
||
WHEN (SELECT COUNT(*) FROM public.knowledge_bases) = (SELECT COUNT(*) FROM pkb_schema.knowledge_bases)
|
||
THEN '✅ 一致'
|
||
ELSE '❌ 不一致'
|
||
END
|
||
|
||
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;
|
||
|
||
\echo ''
|
||
|
||
-- ========================================
|
||
-- 5. 外键约束检查
|
||
-- ========================================
|
||
\echo '5️⃣ 外键约束检查'
|
||
\echo '----------------------------------------'
|
||
|
||
SELECT
|
||
tc.table_schema AS schema_name,
|
||
tc.table_name,
|
||
tc.constraint_name,
|
||
kcu.column_name,
|
||
ccu.table_schema AS ref_schema,
|
||
ccu.table_name AS ref_table,
|
||
ccu.column_name AS ref_column
|
||
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;
|
||
|
||
\echo ''
|
||
|
||
-- ========================================
|
||
-- 6. 索引统计
|
||
-- ========================================
|
||
\echo '6️⃣ 索引统计'
|
||
\echo '----------------------------------------'
|
||
|
||
SELECT
|
||
schemaname,
|
||
COUNT(*) as index_count
|
||
FROM pg_indexes
|
||
WHERE schemaname IN ('platform_schema', 'aia_schema', 'pkb_schema')
|
||
GROUP BY schemaname
|
||
ORDER BY schemaname;
|
||
|
||
\echo ''
|
||
|
||
-- ========================================
|
||
-- 7. 数据采样(前3条记录)
|
||
-- ========================================
|
||
\echo '7️⃣ 数据采样验证'
|
||
\echo '----------------------------------------'
|
||
|
||
\echo '【platform_schema.users】'
|
||
SELECT id, email, name, role, created_at
|
||
FROM platform_schema.users
|
||
ORDER BY created_at DESC
|
||
LIMIT 3;
|
||
|
||
\echo ''
|
||
\echo '【aia_schema.projects】'
|
||
SELECT id, name, research_type, conversation_count, created_at
|
||
FROM aia_schema.projects
|
||
ORDER BY created_at DESC
|
||
LIMIT 3;
|
||
|
||
\echo ''
|
||
\echo '【pkb_schema.knowledge_bases】'
|
||
SELECT id, name, file_count, created_at
|
||
FROM pkb_schema.knowledge_bases
|
||
ORDER BY created_at DESC
|
||
LIMIT 3;
|
||
|
||
\echo ''
|
||
|
||
-- ========================================
|
||
-- 8. 跨Schema引用验证
|
||
-- ========================================
|
||
\echo '8️⃣ 跨Schema引用完整性'
|
||
\echo '----------------------------------------'
|
||
|
||
-- 检查aia_schema.projects的user_id是否都存在
|
||
SELECT
|
||
'aia_schema.projects → platform_schema.users' AS reference,
|
||
COUNT(*) AS total_records,
|
||
COUNT(u.id) AS valid_references,
|
||
COUNT(*) - COUNT(u.id) AS invalid_count,
|
||
CASE
|
||
WHEN COUNT(*) = COUNT(u.id) THEN '✅ 全部有效'
|
||
ELSE '❌ 存在无效引用'
|
||
END AS status
|
||
FROM aia_schema.projects p
|
||
LEFT JOIN platform_schema.users u ON p.user_id = u.id
|
||
|
||
UNION ALL
|
||
|
||
-- 检查pkb_schema.knowledge_bases的user_id
|
||
SELECT
|
||
'pkb_schema.knowledge_bases → platform_schema.users',
|
||
COUNT(*),
|
||
COUNT(u.id),
|
||
COUNT(*) - COUNT(u.id),
|
||
CASE
|
||
WHEN COUNT(*) = COUNT(u.id) THEN '✅ 全部有效'
|
||
ELSE '❌ 存在无效引用'
|
||
END
|
||
FROM pkb_schema.knowledge_bases kb
|
||
LEFT JOIN platform_schema.users u ON kb.user_id = u.id
|
||
|
||
UNION ALL
|
||
|
||
-- 检查aia_schema.conversations → aia_schema.projects
|
||
SELECT
|
||
'aia_schema.conversations → aia_schema.projects',
|
||
COUNT(*),
|
||
COUNT(p.id),
|
||
COUNT(*) - COUNT(p.id),
|
||
CASE
|
||
WHEN COUNT(*) = COUNT(p.id) OR COUNT(*) = 0 THEN '✅ 全部有效'
|
||
ELSE '❌ 存在无效引用'
|
||
END
|
||
FROM aia_schema.conversations c
|
||
LEFT JOIN aia_schema.projects p ON c.project_id = p.id
|
||
WHERE c.project_id IS NOT NULL;
|
||
|
||
\echo ''
|
||
|
||
-- ========================================
|
||
-- 9. 最终总结
|
||
-- ========================================
|
||
\echo '========================================'
|
||
\echo '✅ 验证完成!'
|
||
\echo '========================================'
|
||
\echo ''
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|