-- =================================================================== -- 全局配置数据迁移脚本 -- 从 ak_global_configs (key后缀方式) 迁移到 ak_global_config + ak_global_config_translations -- =================================================================== -- 1. 备份原有数据 CREATE TABLE IF NOT EXISTS public.ak_global_configs_backup AS SELECT * FROM public.ak_global_configs; -- 2. 创建迁移日志表 CREATE TABLE IF NOT EXISTS public.migration_log ( id UUID DEFAULT uuid_generate_v4() PRIMARY KEY, migration_name VARCHAR(100) NOT NULL, status VARCHAR(20) NOT NULL, -- 'started', 'completed', 'failed' message TEXT, created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() ); -- 记录迁移开始 INSERT INTO public.migration_log (migration_name, status, message) VALUES ('global_config_migration', 'started', '开始迁移全局配置数据'); -- 3. 迁移函数 CREATE OR REPLACE FUNCTION migrate_config_item( p_base_key VARCHAR(100), p_category VARCHAR(50), p_is_translatable BOOLEAN, p_sort_order INTEGER ) RETURNS VOID AS $$ DECLARE config_id UUID; zh_value TEXT := NULL; en_value TEXT := NULL; tw_value TEXT := NULL; ja_value TEXT := NULL; default_val TEXT := NULL; BEGIN -- 获取各语言的值 IF p_is_translatable THEN SELECT config_value INTO zh_value FROM public.ak_global_configs WHERE config_key = p_base_key || '_zh' AND is_active = true; SELECT config_value INTO en_value FROM public.ak_global_configs WHERE config_key = p_base_key || '_en' AND is_active = true; SELECT config_value INTO tw_value FROM public.ak_global_configs WHERE config_key = p_base_key || '_tw' AND is_active = true; SELECT config_value INTO ja_value FROM public.ak_global_configs WHERE config_key = p_base_key || '_ja' AND is_active = true; -- 使用中文作为默认值 default_val := zh_value; ELSE -- 非翻译配置项,直接获取值 SELECT config_value INTO default_val FROM public.ak_global_configs WHERE config_key = p_base_key AND is_active = true; END IF; -- 插入主配置记录 INSERT INTO public.ak_global_config ( config_key, config_category, is_translatable, sort_order, default_value ) VALUES ( p_base_key, p_category, p_is_translatable, p_sort_order, default_val ) ON CONFLICT (config_key) DO UPDATE SET config_category = EXCLUDED.config_category, is_translatable = EXCLUDED.is_translatable, sort_order = EXCLUDED.sort_order, default_value = EXCLUDED.default_value, updated_at = NOW() RETURNING id INTO config_id; -- 如果需要翻译,插入翻译记录 IF p_is_translatable THEN -- 中文翻译 IF zh_value IS NOT NULL THEN INSERT INTO public.ak_global_config_translations (config_id, language_code, translated_value) VALUES (config_id, 'zh', zh_value) ON CONFLICT (config_id, language_code) DO UPDATE SET translated_value = EXCLUDED.translated_value, updated_at = NOW(); END IF; -- 英文翻译 IF en_value IS NOT NULL THEN INSERT INTO public.ak_global_config_translations (config_id, language_code, translated_value) VALUES (config_id, 'en', en_value) ON CONFLICT (config_id, language_code) DO UPDATE SET translated_value = EXCLUDED.translated_value, updated_at = NOW(); END IF; -- 繁体中文翻译 IF tw_value IS NOT NULL THEN INSERT INTO public.ak_global_config_translations (config_id, language_code, translated_value) VALUES (config_id, 'tw', tw_value) ON CONFLICT (config_id, language_code) DO UPDATE SET translated_value = EXCLUDED.translated_value, updated_at = NOW(); END IF; -- 日文翻译 IF ja_value IS NOT NULL THEN INSERT INTO public.ak_global_config_translations (config_id, language_code, translated_value) VALUES (config_id, 'ja', ja_value) ON CONFLICT (config_id, language_code) DO UPDATE SET translated_value = EXCLUDED.translated_value, updated_at = NOW(); END IF; END IF; RAISE NOTICE '已迁移配置项: %', p_base_key; END; $$ LANGUAGE plpgsql; -- 4. 执行数据迁移 DO $$ BEGIN RAISE NOTICE '=== 开始迁移全局配置数据 ==='; -- 公司基础信息(需要翻译) PERFORM migrate_config_item('company_name', 'company', true, 1); PERFORM migrate_config_item('company_slogan', 'company', true, 2); PERFORM migrate_config_item('company_address', 'company', true, 3); -- 联系方式(不需要翻译) PERFORM migrate_config_item('company_phone', 'contact', false, 10); PERFORM migrate_config_item('company_email', 'contact', false, 11); PERFORM migrate_config_item('company_icp', 'legal', false, 12); -- 媒体资源(不需要翻译) PERFORM migrate_config_item('company_logo_url', 'media', false, 20); -- 社交媒体链接(不需要翻译) PERFORM migrate_config_item('social_wechat_url', 'social', false, 30); PERFORM migrate_config_item('social_weibo_url', 'social', false, 31); PERFORM migrate_config_item('social_qq_url', 'social', false, 32); PERFORM migrate_config_item('social_linkedin_url', 'social', false, 33); PERFORM migrate_config_item('social_twitter_url', 'social', false, 34); -- 热门搜索关键词(需要翻译) PERFORM migrate_config_item('hot_search_1', 'search', true, 50); PERFORM migrate_config_item('hot_search_2', 'search', true, 51); PERFORM migrate_config_item('hot_search_3', 'search', true, 52); PERFORM migrate_config_item('hot_search_4', 'search', true, 53); PERFORM migrate_config_item('hot_search_5', 'search', true, 54); RAISE NOTICE '=== 全局配置数据迁移完成 ==='; -- 记录迁移成功 INSERT INTO public.migration_log (migration_name, status, message) VALUES ('global_config_migration', 'completed', '全局配置数据迁移成功完成'); EXCEPTION WHEN OTHERS THEN -- 记录迁移失败 INSERT INTO public.migration_log (migration_name, status, message) VALUES ('global_config_migration', 'failed', '全局配置数据迁移失败: ' || SQLERRM); RAISE; END $$; -- 5. 验证迁移结果 DO $$ DECLARE config_count INTEGER; translation_count INTEGER; missing_configs TEXT[] := ARRAY[]::TEXT[]; config_key TEXT; BEGIN RAISE NOTICE '=== 验证迁移结果 ==='; -- 检查主配置表记录数 SELECT COUNT(*) INTO config_count FROM public.ak_global_config WHERE is_active = true; RAISE NOTICE '主配置表记录数: %', config_count; -- 检查翻译表记录数 SELECT COUNT(*) INTO translation_count FROM public.ak_global_config_translations WHERE is_active = true; RAISE NOTICE '翻译表记录数: %', translation_count; -- 检查必要的配置项是否存在 FOR config_key IN SELECT unnest(ARRAY[ 'company_name', 'company_slogan', 'company_address', 'company_phone', 'company_email', 'company_icp', 'company_logo_url', 'social_wechat_url', 'social_weibo_url', 'hot_search_1', 'hot_search_2', 'hot_search_3' ]) LOOP IF NOT EXISTS (SELECT 1 FROM public.ak_global_config WHERE config_key = config_key AND is_active = true) THEN missing_configs := array_append(missing_configs, config_key); END IF; END LOOP; IF array_length(missing_configs, 1) > 0 THEN RAISE WARNING '缺少以下配置项: %', array_to_string(missing_configs, ', '); ELSE RAISE NOTICE '所有必要配置项都已正确迁移'; END IF; -- 显示迁移摘要 RAISE NOTICE '=== 迁移摘要 ==='; RAISE NOTICE '主配置记录: % 条', config_count; RAISE NOTICE '翻译记录: % 条', translation_count; RAISE NOTICE '缺少配置: % 项', COALESCE(array_length(missing_configs, 1), 0); END $$; -- 6. 测试查询 DO $$ DECLARE test_result RECORD; BEGIN RAISE NOTICE '=== 测试新配置系统 ==='; -- 测试中文配置查询 SELECT config_key, config_value INTO test_result FROM vw_global_config_multilingual WHERE config_key = 'company_name' AND language_code = 'zh' LIMIT 1; IF FOUND THEN RAISE NOTICE '中文公司名称: %', test_result.config_value; ELSE RAISE WARNING '未找到中文公司名称配置'; END IF; -- 测试函数调用 RAISE NOTICE '函数测试 - 英文公司名称: %', (SELECT config_value FROM get_config_by_language('en') WHERE config_key = 'company_name' LIMIT 1); -- 测试热门搜索 RAISE NOTICE '热门搜索关键词:'; FOR test_result IN SELECT search_term FROM get_hot_searches('zh') LIMIT 3 LOOP RAISE NOTICE '- %', test_result.search_term; END LOOP; END $$; -- 7. 清理迁移函数 DROP FUNCTION IF EXISTS migrate_config_item(VARCHAR, VARCHAR, BOOLEAN, INTEGER); -- 8. 创建回滚脚本(注释状态,需要时取消注释) /* -- 回滚脚本 - 仅在必要时使用 DO $$ BEGIN RAISE NOTICE '开始回滚操作...'; -- 删除新表数据 DELETE FROM public.ak_global_config_translations; DELETE FROM public.ak_global_config; -- 从备份恢复原有数据(如果需要) -- INSERT INTO public.ak_global_configs SELECT * FROM public.ak_global_configs_backup; RAISE NOTICE '回滚操作完成'; END $$; */ -- 9. 最终消息 DO $$ BEGIN RAISE NOTICE '===================================================='; RAISE NOTICE '全局配置数据迁移脚本执行完成!'; RAISE NOTICE '===================================================='; RAISE NOTICE '后续步骤:'; RAISE NOTICE '1. 检查上述验证结果'; RAISE NOTICE '2. 测试前端应用功能'; RAISE NOTICE '3. 确认无误后可删除备份表:DROP TABLE ak_global_configs_backup;'; RAISE NOTICE '4. 检查迁移日志:SELECT * FROM migration_log WHERE migration_name = ''global_config_migration'';'; RAISE NOTICE '===================================================='; END $$;