Files
1818web-hoduan/V5_MIGRATION_FIX_GUIDE.md
2025-11-14 17:41:15 +08:00

368 lines
9.7 KiB
Markdown
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.

# V5 数据库迁移修复指南
**问题:** 执行V5迁移脚本时出现 `#1060 - Duplicate column name 'provider_type'` 错误
**原因:**
1. `provider_type` 列已经存在之前执行过V5的ALTER TABLE部分
2. V5中插入的RunningHub模型的 `provider_type` 值为空字符串 `''`,应该是 `'runninghub'`
---
## 📋 解决方案
### 方案1修复现有数据库推荐
如果你已经执行过V5脚本的ALTER TABLE部分只需要更新数据
```bash
# 1. 执行修复脚本
mysql -u root -p 1818ai < FIX_V5_provider_type.sql
```
**修复脚本内容:**
```sql
-- 更新所有RunningHub模型的provider_type
UPDATE `points_config`
SET `provider_type` = 'runninghub'
WHERE `model_name` LIKE 'rh_sora2_%'
AND (`provider_type` = '' OR `provider_type` IS NULL);
-- 验证更新结果
SELECT model_name, provider_type, description
FROM `points_config`
WHERE `model_name` LIKE 'rh_sora2_%';
```
**验证步骤:**
```sql
-- 1. 检查列是否存在
SHOW COLUMNS FROM `points_config` LIKE 'provider_type';
SHOW COLUMNS FROM `ai_task` LIKE 'provider_type';
-- 2. 检查RunningHub模型配置
SELECT model_name, provider_type, points_cost, description
FROM `points_config`
WHERE `model_name` LIKE 'rh_sora2_%';
-- 预期结果12个模型provider_type都是'runninghub'
```
---
### 方案2从头执行全新数据库
如果是全新的数据库或需要重新迁移,使用修正版脚本:
```bash
# 使用修正版脚本
mysql -u root -p 1818ai < V5__add_provider_support_CORRECTED.sql
```
**修正版特点:**
- ✅ 使用 `ADD COLUMN IF NOT EXISTS` 避免重复列错误
- ✅ 使用 `CREATE INDEX IF NOT EXISTS` 避免重复索引错误
-`provider_type` 值正确设置为 `'runninghub'`
- ✅ ON DUPLICATE KEY UPDATE 包含所有必要字段
---
## 🔍 问题诊断
### 检查当前数据库状态
```sql
-- 1. 检查points_config表结构
DESC `points_config`;
-- 2. 检查是否有provider_type列
SELECT COUNT(*) as has_column
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = '1818ai'
AND TABLE_NAME = 'points_config'
AND COLUMN_NAME = 'provider_type';
-- 结果为1表示列已存在0表示不存在
-- 3. 检查现有RunningHub模型的provider_type值
SELECT
model_name,
provider_type,
CASE
WHEN provider_type = '' THEN '空字符串(错误)'
WHEN provider_type = 'runninghub' THEN '正确'
WHEN provider_type IS NULL THEN 'NULL错误'
ELSE CONCAT('其他值: ', provider_type)
END as status
FROM `points_config`
WHERE `model_name` LIKE 'rh_sora2_%';
-- 4. 检查是否有RunningHub模型记录
SELECT COUNT(*) as runninghub_model_count
FROM `points_config`
WHERE `model_name` LIKE 'rh_sora2_%';
-- 应该是12个
```
---
## 📝 分步修复流程
### 步骤1备份数据库
```bash
# 备份整个数据库
mysqldump -u root -p 1818ai > backup_before_v5_fix_$(date +%Y%m%d_%H%M%S).sql
# 只备份points_config表
mysqldump -u root -p 1818ai points_config > backup_points_config_$(date +%Y%m%d_%H%M%S).sql
```
### 步骤2检查表结构
```sql
-- 检查points_config是否有provider相关列
SHOW COLUMNS FROM `points_config` WHERE Field IN ('provider_type', 'provider_config');
-- 检查ai_task是否有provider相关列
SHOW COLUMNS FROM `ai_task` WHERE Field IN ('provider_type', 'provider_task_id', 'provider_response');
```
**预期结果:**
```
-- points_config应该有
provider_type | varchar(50) | NO | | openai
provider_config | text | YES | | NULL
-- ai_task应该有
provider_type | varchar(50) | YES | | NULL
provider_task_id | varchar(100) | YES | | NULL
provider_response | text | YES | | NULL
```
### 步骤3根据情况执行修复
**情况A列已存在但RunningHub模型的provider_type值错误**
```sql
-- 直接执行修复脚本
source FIX_V5_provider_type.sql;
```
**情况B列不存在**
```sql
-- 执行完整的V5脚本建议使用修正版
source V5__add_provider_support_CORRECTED.sql;
```
**情况C部分列存在**
```sql
-- 1. 手动添加缺失的列
ALTER TABLE `points_config`
ADD COLUMN IF NOT EXISTS `provider_type` VARCHAR(50) NOT NULL DEFAULT 'openai'
COMMENT 'AI服务提供商类型' AFTER `is_enabled`,
ADD COLUMN IF NOT EXISTS `provider_config` TEXT NULL
COMMENT '服务商特定配置JSON格式' AFTER `provider_type`;
ALTER TABLE `ai_task`
ADD COLUMN IF NOT EXISTS `provider_type` VARCHAR(50) NULL
COMMENT 'AI服务提供商类型' AFTER `task_type`,
ADD COLUMN IF NOT EXISTS `provider_task_id` VARCHAR(100) NULL
COMMENT '服务商返回的任务ID' AFTER `provider_type`,
ADD COLUMN IF NOT EXISTS `provider_response` TEXT NULL
COMMENT '服务商原始响应JSON' AFTER `provider_task_id`;
-- 2. 执行修复脚本
source FIX_V5_provider_type.sql;
```
### 步骤4验证修复结果
```sql
-- 1. 检查RunningHub模型数量
SELECT COUNT(*) as count
FROM `points_config`
WHERE `model_name` LIKE 'rh_sora2_%';
-- 预期12
-- 2. 检查provider_type值
SELECT
COUNT(*) as total,
SUM(CASE WHEN provider_type = 'runninghub' THEN 1 ELSE 0 END) as correct,
SUM(CASE WHEN provider_type != 'runninghub' THEN 1 ELSE 0 END) as incorrect
FROM `points_config`
WHERE `model_name` LIKE 'rh_sora2_%';
-- 预期total=12, correct=12, incorrect=0
-- 3. 查看所有RunningHub模型
SELECT model_name, provider_type, points_cost, description
FROM `points_config`
WHERE `model_name` LIKE 'rh_sora2_%'
ORDER BY points_cost, model_name;
-- 预期输出:
/*
model_name | provider_type | points_cost | description
----------------------------|---------------|-------------|---------------------------
rh_sora2_text_portrait | runninghub | 160 | RunningHub Sora2 文生视频-竖屏10秒
rh_sora2_text_landscape | runninghub | 160 | RunningHub Sora2 文生视频-横屏10秒
rh_sora2_img_portrait | runninghub | 180 | RunningHub Sora2 图生视频-竖屏10秒
rh_sora2_img_landscape | runninghub | 180 | RunningHub Sora2 图生视频-横屏10秒
...共12条
*/
-- 4. 检查provider_config是否为有效JSON
SELECT
model_name,
provider_config,
CASE
WHEN JSON_VALID(provider_config) THEN '有效JSON'
ELSE '无效JSON'
END as json_status
FROM `points_config`
WHERE `model_name` LIKE 'rh_sora2_%';
-- 所有记录的json_status应该是'有效JSON'
```
---
## ⚠️ 常见错误处理
### 错误1Duplicate column name 'provider_type'
**错误信息:**
```
#1060 - Duplicate column name 'provider_type'
```
**原因:** 列已经存在
**解决:**
```sql
-- 跳过ALTER TABLE直接执行修复脚本
source FIX_V5_provider_type.sql;
```
---
### 错误2Duplicate entry for key 'PRIMARY'
**错误信息:**
```
#1062 - Duplicate entry 'rh_sora2_text_portrait' for key 'PRIMARY'
```
**原因:** RunningHub模型已经插入过
**解决:**
```sql
-- 使用UPDATE而非INSERT
UPDATE `points_config`
SET
provider_type = 'runninghub',
provider_config = '{"webappId":"1973555977595301890","taskType":"text2video","model":"portrait","duration":10}',
update_time = NOW()
WHERE model_name = 'rh_sora2_text_portrait';
-- 或者直接执行修复脚本(批量更新)
source FIX_V5_provider_type.sql;
```
---
### 错误3provider_type值为空字符串
**症状:**
```sql
SELECT model_name, provider_type
FROM `points_config`
WHERE `model_name` LIKE 'rh_sora2_%';
-- 结果provider_type显示为空或''
```
**解决:**
```sql
-- 执行修复脚本
source FIX_V5_provider_type.sql;
```
---
## ✅ 验证清单
修复完成后,确认以下所有项:
- [ ] `points_config` 表有 `provider_type``provider_config`
- [ ] `ai_task` 表有 `provider_type``provider_task_id``provider_response`
- [ ] 有12个RunningHub模型记录
- [ ] 所有RunningHub模型的 `provider_type` 值为 `'runninghub'`
- [ ] 所有RunningHub模型的 `provider_config` 是有效的JSON
- [ ] 索引 `idx_provider_task_id``idx_provider_type_status` 存在
**验证命令:**
```bash
# 执行完整验证
mysql -u root -p 1818ai << 'EOF'
-- 1. 检查列
SELECT 'points_config columns' as check_item, COUNT(*) as result
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = '1818ai' AND TABLE_NAME = 'points_config'
AND COLUMN_NAME IN ('provider_type', 'provider_config');
-- 预期2
SELECT 'ai_task columns' as check_item, COUNT(*) as result
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = '1818ai' AND TABLE_NAME = 'ai_task'
AND COLUMN_NAME IN ('provider_type', 'provider_task_id', 'provider_response');
-- 预期3
-- 2. 检查RunningHub模型
SELECT 'RunningHub models' as check_item, COUNT(*) as result
FROM `points_config`
WHERE `model_name` LIKE 'rh_sora2_%';
-- 预期12
-- 3. 检查provider_type正确性
SELECT 'Correct provider_type' as check_item, COUNT(*) as result
FROM `points_config`
WHERE `model_name` LIKE 'rh_sora2_%' AND `provider_type` = 'runninghub';
-- 预期12
-- 4. 检查索引
SELECT 'Indexes' as check_item, COUNT(*) as result
FROM INFORMATION_SCHEMA.STATISTICS
WHERE TABLE_SCHEMA = '1818ai' AND TABLE_NAME = 'ai_task'
AND INDEX_NAME IN ('idx_provider_task_id', 'idx_provider_type_status');
-- 预期2至少
EOF
```
---
## 📞 技术支持
如果遇到其他问题,请提供以下信息:
```sql
-- 1. 数据库版本
SELECT VERSION();
-- 2. 表结构
SHOW CREATE TABLE `points_config`;
SHOW CREATE TABLE `ai_task`;
-- 3. 现有数据
SELECT model_name, provider_type, provider_config
FROM `points_config`
WHERE `model_name` LIKE 'rh_sora2_%' OR model_name LIKE 'sora_%';
-- 4. 错误信息截图
```
---
**修复完成!**
执行完修复脚本后系统应该可以正常使用RunningHub功能了。