033_create_long_text_audio_table.sql 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. -- 迁移文件: 033_create_long_text_audio_table.sql
  2. -- 描述: 创建长文本转音频任务表(异步模式)
  3. -- 策略: 全新表,支持长文本分段合成
  4. -- ============================================
  5. -- 正向迁移: 创建表和索引
  6. -- ============================================
  7. -- 创建 long_text_audio 表
  8. CREATE TABLE IF NOT EXISTS long_text_audio (
  9. id SERIAL PRIMARY KEY,
  10. user_id VARCHAR(50) NOT NULL,
  11. task_id VARCHAR(100) NOT NULL UNIQUE,
  12. model VARCHAR(100) NOT NULL,
  13. voice VARCHAR(100) NOT NULL,
  14. text TEXT NOT NULL,
  15. text_length INTEGER NOT NULL,
  16. segment_count INTEGER DEFAULT 0,
  17. segments JSONB DEFAULT '[]'::jsonb,
  18. audio_url VARCHAR(500),
  19. status VARCHAR(20) DEFAULT 'PENDING',
  20. progress INTEGER DEFAULT 0,
  21. duration NUMERIC(10, 2),
  22. format VARCHAR(20) DEFAULT 'mp3',
  23. bill NUMERIC(10, 4) DEFAULT 0,
  24. custom_name VARCHAR(200),
  25. error_message TEXT,
  26. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  27. updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  28. completed_at TIMESTAMP,
  29. CONSTRAINT fk_long_text_audio_user
  30. FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
  31. );
  32. -- 添加表注释
  33. COMMENT ON TABLE long_text_audio IS '长文本转音频任务表(异步模式,支持分段合成)';
  34. COMMENT ON COLUMN long_text_audio.id IS '主键ID';
  35. COMMENT ON COLUMN long_text_audio.user_id IS '用户ID(外键关联users表)';
  36. COMMENT ON COLUMN long_text_audio.task_id IS '任务ID(本地生成UUID)';
  37. COMMENT ON COLUMN long_text_audio.model IS 'TTS模型';
  38. COMMENT ON COLUMN long_text_audio.voice IS '音色ID';
  39. COMMENT ON COLUMN long_text_audio.text IS '原始长文本';
  40. COMMENT ON COLUMN long_text_audio.text_length IS '文本总长度';
  41. COMMENT ON COLUMN long_text_audio.segment_count IS '分段数量';
  42. COMMENT ON COLUMN long_text_audio.segments IS '分段信息(JSONB数组)[{index, text, task_id, audio_url, duration, status}]';
  43. COMMENT ON COLUMN long_text_audio.audio_url IS '最终拼接音频URL';
  44. COMMENT ON COLUMN long_text_audio.status IS '任务状态(PENDING/PROCESSING/SUCCEEDED/FAILED)';
  45. COMMENT ON COLUMN long_text_audio.progress IS '进度百分比(0-100)';
  46. COMMENT ON COLUMN long_text_audio.duration IS '总时长(秒)';
  47. COMMENT ON COLUMN long_text_audio.format IS '音频格式';
  48. COMMENT ON COLUMN long_text_audio.bill IS '费用(元)';
  49. COMMENT ON COLUMN long_text_audio.custom_name IS '用户自定义名称';
  50. COMMENT ON COLUMN long_text_audio.error_message IS '错误信息(失败时)';
  51. COMMENT ON COLUMN long_text_audio.created_at IS '创建时间';
  52. COMMENT ON COLUMN long_text_audio.updated_at IS '更新时间';
  53. COMMENT ON COLUMN long_text_audio.completed_at IS '完成时间';
  54. -- 创建索引(优化查询性能)
  55. CREATE INDEX idx_long_text_audio_user_id ON long_text_audio(user_id);
  56. CREATE INDEX idx_long_text_audio_task_id ON long_text_audio(task_id);
  57. CREATE INDEX idx_long_text_audio_status ON long_text_audio(status);
  58. CREATE INDEX idx_long_text_audio_created_at ON long_text_audio(created_at DESC);
  59. -- ============================================
  60. -- 回滚迁移: 删除表和索引
  61. -- ============================================
  62. -- DROP INDEX IF EXISTS idx_long_text_audio_created_at;
  63. -- DROP INDEX IF EXISTS idx_long_text_audio_status;
  64. -- DROP INDEX IF EXISTS idx_long_text_audio_task_id;
  65. -- DROP INDEX IF EXISTS idx_long_text_audio_user_id;
  66. -- DROP TABLE IF EXISTS long_text_audio;