Initial commit of akmon project
This commit is contained in:
280
migrate_global_config_data.sql
Normal file
280
migrate_global_config_data.sql
Normal file
@@ -0,0 +1,280 @@
|
||||
-- ===================================================================
|
||||
-- 全局配置数据迁移脚本
|
||||
-- 从 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 $$;
|
||||
Reference in New Issue
Block a user