add_missing_columns.sql 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. -- 数据库迁移:同步代码中的模型定义到数据库
  2. -- 执行前请备份数据库!
  3. BEGIN;
  4. -- ============================================
  5. -- 1. models_new 表添加缺失字段
  6. -- ============================================
  7. DO $$ BEGIN
  8. ALTER TABLE aigcspace.models_new ADD COLUMN IF NOT EXISTS group_name VARCHAR(100);
  9. EXCEPTION WHEN duplicate_column THEN NULL;
  10. END $$;
  11. DO $$ BEGIN
  12. ALTER TABLE aigcspace.models_new ADD COLUMN IF NOT EXISTS encrypted_api_key TEXT;
  13. EXCEPTION WHEN duplicate_column THEN NULL;
  14. END $$;
  15. DO $$ BEGIN
  16. ALTER TABLE aigcspace.models_new ADD COLUMN IF NOT EXISTS is_thinking BOOLEAN NOT NULL DEFAULT FALSE;
  17. EXCEPTION WHEN duplicate_column THEN NULL;
  18. END $$;
  19. DO $$ BEGIN
  20. ALTER TABLE aigcspace.models_new ADD COLUMN IF NOT EXISTS source_keys TEXT[];
  21. EXCEPTION WHEN duplicate_column THEN NULL;
  22. END $$;
  23. DO $$ BEGIN
  24. ALTER TABLE aigcspace.models_new ADD COLUMN IF NOT EXISTS normalized_keys TEXT[];
  25. EXCEPTION WHEN duplicate_column THEN NULL;
  26. END $$;
  27. DO $$ BEGIN
  28. ALTER TABLE aigcspace.models_new ADD COLUMN IF NOT EXISTS is_local BOOLEAN NOT NULL DEFAULT FALSE;
  29. EXCEPTION WHEN duplicate_column THEN NULL;
  30. END $$;
  31. DO $$ BEGIN
  32. ALTER TABLE aigcspace.models_new ADD COLUMN IF NOT EXISTS user_id VARCHAR(50);
  33. EXCEPTION WHEN duplicate_column THEN NULL;
  34. END $$;
  35. DO $$ BEGIN
  36. ALTER TABLE aigcspace.models_new ADD COLUMN IF NOT EXISTS base_url VARCHAR(500);
  37. EXCEPTION WHEN duplicate_column THEN NULL;
  38. END $$;
  39. DO $$ BEGIN
  40. ALTER TABLE aigcspace.models_new ADD COLUMN IF NOT EXISTS local_api_key VARCHAR(500);
  41. EXCEPTION WHEN duplicate_column THEN NULL;
  42. END $$;
  43. DO $$ BEGIN
  44. ALTER TABLE aigcspace.models_new ADD COLUMN IF NOT EXISTS visibility VARCHAR(20) DEFAULT 'user';
  45. EXCEPTION WHEN duplicate_column THEN NULL;
  46. END $$;
  47. -- 添加外键约束
  48. DO $$ BEGIN
  49. ALTER TABLE aigcspace.models_new ADD CONSTRAINT fk_models_new_user_id
  50. FOREIGN KEY (user_id) REFERENCES aigcspace.users(id);
  51. EXCEPTION WHEN duplicate_object THEN NULL;
  52. END $$;
  53. -- 添加索引
  54. CREATE INDEX IF NOT EXISTS idx_models_new_is_local ON aigcspace.models_new(is_local);
  55. CREATE INDEX IF NOT EXISTS idx_models_new_group_name ON aigcspace.models_new(group_name);
  56. -- ============================================
  57. -- 2. 创建可能缺失的表(使用 IF NOT EXISTS)
  58. -- ============================================
  59. -- asr_recognition 表
  60. CREATE TABLE IF NOT EXISTS aigcspace.asr_recognition (
  61. id SERIAL PRIMARY KEY,
  62. user_id VARCHAR(50) NOT NULL REFERENCES aigcspace.users(id) ON DELETE CASCADE,
  63. model VARCHAR(100) NOT NULL,
  64. audio_url VARCHAR(500),
  65. audio_base64 TEXT,
  66. language VARCHAR(20),
  67. enable_itn BOOLEAN DEFAULT FALSE,
  68. context TEXT,
  69. result_text TEXT NOT NULL,
  70. detected_language VARCHAR(20),
  71. emotion VARCHAR(20),
  72. duration INTEGER,
  73. input_tokens INTEGER DEFAULT 0,
  74. output_tokens INTEGER DEFAULT 0,
  75. bill NUMERIC(10,4) DEFAULT 0,
  76. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  77. );
  78. -- asr_recognition_v2 表
  79. CREATE TABLE IF NOT EXISTS aigcspace.asr_recognition_v2 (
  80. id SERIAL PRIMARY KEY,
  81. user_id VARCHAR(50) NOT NULL REFERENCES aigcspace.users(id) ON DELETE CASCADE,
  82. task_id VARCHAR(100) UNIQUE NOT NULL,
  83. model VARCHAR(100) NOT NULL,
  84. file_url VARCHAR(500) NOT NULL,
  85. status VARCHAR(20) DEFAULT 'PENDING',
  86. result_text TEXT,
  87. result_url VARCHAR(500),
  88. duration INTEGER,
  89. bill NUMERIC(10,4) DEFAULT 0,
  90. error_message TEXT,
  91. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  92. updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  93. completed_at TIMESTAMP
  94. );
  95. -- audio_synthesis_v2 表
  96. CREATE TABLE IF NOT EXISTS aigcspace.audio_synthesis_v2 (
  97. id SERIAL PRIMARY KEY,
  98. user_id VARCHAR(50) NOT NULL REFERENCES aigcspace.users(id) ON DELETE CASCADE,
  99. task_id VARCHAR(100) UNIQUE NOT NULL,
  100. model VARCHAR(100) NOT NULL,
  101. voice VARCHAR(100) NOT NULL,
  102. text TEXT NOT NULL,
  103. audio_url VARCHAR(500),
  104. status VARCHAR(20) DEFAULT 'PENDING',
  105. duration NUMERIC(10,2),
  106. format VARCHAR(20) DEFAULT 'mp3',
  107. characters INTEGER,
  108. bill NUMERIC(10,4) DEFAULT 0,
  109. custom_name VARCHAR(200),
  110. error_message TEXT,
  111. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  112. updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  113. completed_at TIMESTAMP
  114. );
  115. -- voice_clone_v2 表
  116. CREATE TABLE IF NOT EXISTS aigcspace.voice_clone_v2 (
  117. id SERIAL PRIMARY KEY,
  118. user_id VARCHAR(50) NOT NULL REFERENCES aigcspace.users(id) ON DELETE CASCADE,
  119. task_id VARCHAR(100) UNIQUE NOT NULL,
  120. voice_id VARCHAR(200),
  121. target_model VARCHAR(100) NOT NULL,
  122. prefix VARCHAR(20) NOT NULL,
  123. voice_name VARCHAR(50),
  124. audio_url VARCHAR(500),
  125. status VARCHAR(20) DEFAULT 'PENDING',
  126. bill NUMERIC(10,4) DEFAULT 0,
  127. error_message TEXT,
  128. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  129. updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  130. completed_at TIMESTAMP
  131. );
  132. -- long_text_audio 表
  133. CREATE TABLE IF NOT EXISTS aigcspace.long_text_audio (
  134. id SERIAL PRIMARY KEY,
  135. user_id VARCHAR(50) NOT NULL REFERENCES aigcspace.users(id) ON DELETE CASCADE,
  136. task_id VARCHAR(100) UNIQUE NOT NULL,
  137. model VARCHAR(100) NOT NULL,
  138. voice VARCHAR(100) NOT NULL,
  139. text TEXT NOT NULL,
  140. text_length INTEGER NOT NULL,
  141. segment_count INTEGER DEFAULT 0,
  142. segments JSONB DEFAULT '[]',
  143. audio_url VARCHAR(500),
  144. status VARCHAR(20) DEFAULT 'PENDING',
  145. progress INTEGER DEFAULT 0,
  146. duration NUMERIC(10,2),
  147. format VARCHAR(20) DEFAULT 'mp3',
  148. bill NUMERIC(10,4) DEFAULT 0,
  149. custom_name VARCHAR(200),
  150. error_message TEXT,
  151. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  152. updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  153. completed_at TIMESTAMP
  154. );
  155. -- system_voice 表
  156. CREATE TABLE IF NOT EXISTS aigcspace.system_voice (
  157. id SERIAL PRIMARY KEY,
  158. voice_id VARCHAR(100) UNIQUE NOT NULL,
  159. name VARCHAR(50) NOT NULL,
  160. trait VARCHAR(100),
  161. age VARCHAR(20),
  162. category VARCHAR(50),
  163. languages JSONB DEFAULT '[]',
  164. models JSONB DEFAULT '[]',
  165. ssml_support BOOLEAN DEFAULT FALSE,
  166. instruct_support BOOLEAN DEFAULT FALSE,
  167. timestamp_support BOOLEAN DEFAULT FALSE,
  168. is_active BOOLEAN DEFAULT TRUE,
  169. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  170. );
  171. -- model_price_new 表(如果不存在)
  172. CREATE TABLE IF NOT EXISTS aigcspace.model_price_new (
  173. id SERIAL PRIMARY KEY,
  174. model_code VARCHAR(200) NOT NULL,
  175. label VARCHAR(200) NOT NULL,
  176. tier_min NUMERIC(20,2),
  177. tier_max NUMERIC(20,2),
  178. tier_unit VARCHAR(50),
  179. input_price_original NUMERIC(20,8) NOT NULL DEFAULT 0,
  180. output_price_original NUMERIC(20,8) NOT NULL DEFAULT 0,
  181. discount_rate NUMERIC(5,4) NOT NULL DEFAULT 1,
  182. discount_label VARCHAR(20),
  183. input_price_discounted NUMERIC(20,8) NOT NULL DEFAULT 0,
  184. output_price_discounted NUMERIC(20,8) NOT NULL DEFAULT 0,
  185. currency VARCHAR(10) NOT NULL DEFAULT 'CNY',
  186. unit VARCHAR(100) NOT NULL,
  187. display_multiplier INTEGER NOT NULL DEFAULT 1,
  188. source_url TEXT,
  189. crawled_at TIMESTAMP NOT NULL,
  190. is_active BOOLEAN NOT NULL DEFAULT TRUE,
  191. created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  192. updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  193. );
  194. -- crawler_sync_log 表(如果不存在)
  195. CREATE TABLE IF NOT EXISTS aigcspace.crawler_sync_log (
  196. id SERIAL PRIMARY KEY,
  197. crawler_version INTEGER NOT NULL,
  198. synced_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  199. model_count INTEGER NOT NULL DEFAULT 0,
  200. price_count INTEGER NOT NULL DEFAULT 0,
  201. status VARCHAR(20) NOT NULL DEFAULT 'success',
  202. error_message TEXT
  203. );
  204. -- user_local_model_permission 表(如果不存在)
  205. CREATE TABLE IF NOT EXISTS aigcspace.user_local_model_permission (
  206. id SERIAL PRIMARY KEY,
  207. user_id VARCHAR(50) NOT NULL REFERENCES aigcspace.users(id) ON DELETE CASCADE,
  208. model_id INTEGER NOT NULL,
  209. granted_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  210. granted_by VARCHAR(50),
  211. UNIQUE(user_id, model_id)
  212. );
  213. COMMIT;
  214. -- 验证迁移结果
  215. SELECT table_name FROM information_schema.tables
  216. WHERE table_schema = 'aigcspace' ORDER BY table_name;