368 lines
9.7 KiB
Markdown
368 lines
9.7 KiB
Markdown
|
|
# 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'
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## ⚠️ 常见错误处理
|
|||
|
|
|
|||
|
|
### 错误1:Duplicate column name 'provider_type'
|
|||
|
|
|
|||
|
|
**错误信息:**
|
|||
|
|
```
|
|||
|
|
#1060 - Duplicate column name 'provider_type'
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**原因:** 列已经存在
|
|||
|
|
|
|||
|
|
**解决:**
|
|||
|
|
```sql
|
|||
|
|
-- 跳过ALTER TABLE,直接执行修复脚本
|
|||
|
|
source FIX_V5_provider_type.sql;
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 错误2:Duplicate 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;
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
### 错误3:provider_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功能了。
|
|||
|
|
|
|||
|
|
|