Bladeren bron

fix: 导出脚本使用 SERIAL PRIMARY KEY 替代 integer+PK,修复 SSO 登录插入新用户时 id 为 NULL 的问题

kinglee 6 dagen geleden
bovenliggende
commit
513a3a3670
2 gewijzigde bestanden met toevoegingen van 24 en 28 verwijderingen
  1. 17 27
      backup/maas_collect_init.sql
  2. 7 1
      dump_pg_to_sql.py

+ 17 - 27
backup/maas_collect_init.sql

@@ -5,12 +5,11 @@
 -- Table: ai_conversation
 DROP TABLE IF EXISTS ai_conversation CASCADE;
 CREATE TABLE ai_conversation (
-    id integer NOT NULL,
+    id SERIAL PRIMARY KEY,
     title VARCHAR(200) NULL,
     user_id integer NULL,
     created_at TIMESTAMP NULL,
-    updated_at TIMESTAMP NULL,
-    PRIMARY KEY (id)
+    updated_at TIMESTAMP NULL
 );
 
 INSERT INTO ai_conversation (id, title, user_id, created_at, updated_at) VALUES (1, '统计一下最近采集的新闻来源分布', 1, '2026-01-08 02:14:00.447021', '2026-01-08 02:14:00.447021');
@@ -23,13 +22,12 @@ INSERT INTO ai_conversation (id, title, user_id, created_at, updated_at) VALUES
 -- Table: ai_message
 DROP TABLE IF EXISTS ai_message CASCADE;
 CREATE TABLE ai_message (
-    id integer NOT NULL,
+    id SERIAL PRIMARY KEY,
     conversation_id integer NOT NULL,
     role VARCHAR(20) NOT NULL,
     content text NULL,
     meta_data text NULL,
-    created_at TIMESTAMP NULL,
-    PRIMARY KEY (id)
+    created_at TIMESTAMP NULL
 );
 
 INSERT INTO ai_message (id, conversation_id, role, content, meta_data, created_at) VALUES (1, 1, 'user', '统计一下最近采集的新闻来源分布', NULL, '2026-01-08 02:14:00.475599');
@@ -139,7 +137,7 @@ INSERT INTO ai_message (id, conversation_id, role, content, meta_data, created_a
 -- Table: ai_model
 DROP TABLE IF EXISTS ai_model CASCADE;
 CREATE TABLE ai_model (
-    id integer NOT NULL,
+    id SERIAL PRIMARY KEY,
     name VARCHAR(100) NOT NULL,
     provider VARCHAR(50) NULL,
     api_base VARCHAR(500) NOT NULL,
@@ -149,8 +147,7 @@ CREATE TABLE ai_model (
     is_active boolean NULL,
     total_tokens bigint NULL,
     created_at TIMESTAMP NULL,
-    updated_at TIMESTAMP NULL,
-    PRIMARY KEY (id)
+    updated_at TIMESTAMP NULL
 );
 
 INSERT INTO ai_model (id, name, provider, api_base, api_key, model_name, system_prompt, is_active, total_tokens, created_at, updated_at) VALUES (1, 'SiliconFlow DeepSeek', 'openai', 'https://api.siliconflow.cn/v1/', 'sk-uicieiqmaiesefjbsgedmiittepzssysykgjkveocnkmeyxh', 'Qwen/Qwen3-Next-80B-A3B-Instruct', '', TRUE, 133619, '2026-01-07 08:14:50.280345', '2026-01-08 02:44:26.931815');
@@ -160,14 +157,13 @@ INSERT INTO ai_model (id, name, provider, api_base, api_key, model_name, system_
 -- Table: collection_task
 DROP TABLE IF EXISTS collection_task CASCADE;
 CREATE TABLE collection_task (
-    id integer NOT NULL,
+    id SERIAL PRIMARY KEY,
     keyword VARCHAR(100) NOT NULL,
     spider_source_id integer NOT NULL,
     pages integer NULL,
     status VARCHAR(20) NULL,
     created_at TIMESTAMP NULL,
-    finished_at TIMESTAMP NULL,
-    PRIMARY KEY (id)
+    finished_at TIMESTAMP NULL
 );
 
 INSERT INTO collection_task (id, keyword, spider_source_id, pages, status, created_at, finished_at) VALUES (1, '成都', 1, 1, 'completed', '2026-01-07 03:43:59.915345', '2026-01-07 03:44:03.635300');
@@ -204,7 +200,7 @@ INSERT INTO collection_task (id, keyword, spider_source_id, pages, status, creat
 -- Table: deep_collection
 DROP TABLE IF EXISTS deep_collection CASCADE;
 CREATE TABLE deep_collection (
-    id integer NOT NULL,
+    id SERIAL PRIMARY KEY,
     title VARCHAR(500) NULL,
     url text NOT NULL,
     content text NULL,
@@ -215,7 +211,6 @@ CREATE TABLE deep_collection (
     error_msg text NULL,
     created_at TIMESTAMP NULL,
     updated_at TIMESTAMP NULL,
-    PRIMARY KEY (id),
     CONSTRAINT deep_collection_url_key UNIQUE (url)
 );
 
@@ -7784,7 +7779,7 @@ link
 -- Table: knowledge_import_task
 DROP TABLE IF EXISTS knowledge_import_task CASCADE;
 CREATE TABLE knowledge_import_task (
-    id integer NOT NULL,
+    id SERIAL PRIMARY KEY,
     task_no VARCHAR(64) NOT NULL,
     sample_task_id VARCHAR(64) NULL,
     kb_id VARCHAR(64) NOT NULL,
@@ -7799,8 +7794,7 @@ CREATE TABLE knowledge_import_task (
     error_message text NULL,
     created_by integer NULL,
     created_at TIMESTAMP NULL,
-    updated_at TIMESTAMP NULL,
-    PRIMARY KEY (id)
+    updated_at TIMESTAMP NULL
 );
 
 -- Sequence reset done
@@ -7808,7 +7802,7 @@ CREATE TABLE knowledge_import_task (
 -- Table: spider_result
 DROP TABLE IF EXISTS spider_result CASCADE;
 CREATE TABLE spider_result (
-    id integer NOT NULL,
+    id SERIAL PRIMARY KEY,
     task_id integer NULL,
     title VARCHAR(500) NULL,
     abstract text NULL,
@@ -7817,8 +7811,7 @@ CREATE TABLE spider_result (
     link text NULL,
     published_at VARCHAR(50) NULL,
     has_deep_collection boolean NULL,
-    created_at TIMESTAMP NULL,
-    PRIMARY KEY (id)
+    created_at TIMESTAMP NULL
 );
 
 INSERT INTO spider_result (id, task_id, title, abstract, source, cover, link, published_at, has_deep_collection, created_at) VALUES (8, 11, '追光“十五五”丨科产融合:科技和产业精准对接,成都向“新”而行', '2025年12月9日,成都市委十四届八次全会召开。全会提出,要始终坚持“创新驱动、开放引领、科产融合、强县活区”发展战略。 其中,“科产融合”被赋予明确使命:抢抓新一轮科技革命和产业变革机遇,大力推进科技和产业供需精准对接,促进更多科技创新成果应用到具体产业和产...', '界面新闻', '', 'https://www.jiemian.com/article/13853301.html', NULL, FALSE, '2026-01-07 07:38:35.326917');
@@ -7946,7 +7939,7 @@ INSERT INTO spider_result (id, task_id, title, abstract, source, cover, link, pu
 -- Table: spider_source
 DROP TABLE IF EXISTS spider_source CASCADE;
 CREATE TABLE spider_source (
-    id integer NOT NULL,
+    id SERIAL PRIMARY KEY,
     name VARCHAR(100) NOT NULL,
     code_identifier VARCHAR(100) NOT NULL,
     description text NULL,
@@ -7963,7 +7956,6 @@ CREATE TABLE spider_source (
     pagination_param VARCHAR(50) NULL,
     pagination_step integer NULL,
     pagination_start integer NULL,
-    PRIMARY KEY (id),
     CONSTRAINT spider_source_code_identifier_key UNIQUE (code_identifier),
     CONSTRAINT spider_source_name_key UNIQUE (name)
 );
@@ -7977,14 +7969,13 @@ INSERT INTO spider_source (id, name, code_identifier, description, status, creat
 -- Table: token_usage_log
 DROP TABLE IF EXISTS token_usage_log CASCADE;
 CREATE TABLE token_usage_log (
-    id integer NOT NULL,
+    id SERIAL PRIMARY KEY,
     model_id integer NULL,
     prompt_tokens integer NULL,
     completion_tokens integer NULL,
     total_tokens integer NULL,
     request_type VARCHAR(50) NULL,
-    created_at TIMESTAMP NULL,
-    PRIMARY KEY (id)
+    created_at TIMESTAMP NULL
 );
 
 INSERT INTO token_usage_log (id, model_id, prompt_tokens, completion_tokens, total_tokens, request_type, created_at) VALUES (1, 1, 11, 0, 11, 'test', '2026-01-07 08:34:12.457081');
@@ -8157,7 +8148,7 @@ INSERT INTO token_usage_log (id, model_id, prompt_tokens, completion_tokens, tot
 -- Table: user
 DROP TABLE IF EXISTS "user" CASCADE;
 CREATE TABLE "user" (
-    id integer NOT NULL,
+    id SERIAL PRIMARY KEY,
     username VARCHAR(64) NULL,
     password_hash VARCHAR(512) NULL,
     sso_sub VARCHAR(256) NULL,
@@ -8166,7 +8157,6 @@ CREATE TABLE "user" (
     email VARCHAR(120) NULL,
     phone VARCHAR(30) NULL,
     avatar_url VARCHAR(500) NULL,
-    PRIMARY KEY (id),
     CONSTRAINT user_sso_sub_key UNIQUE (sso_sub)
 );
 

+ 7 - 1
dump_pg_to_sql.py

@@ -90,7 +90,13 @@ def dump():
 
         # 生成 CREATE TABLE
         col_defs = []
+        pk_col_set = set(pk_cols)
         for col_name, data_type, char_max_len, is_nullable in columns:
+            # 主键 integer 列:使用 SERIAL 替代 integer NOT NULL + 单独的 PRIMARY KEY
+            if col_name in pk_col_set and data_type == "integer":
+                col_defs.append(f"    {col_name} SERIAL PRIMARY KEY")
+                continue
+
             type_str = data_type
             if data_type == "character varying" and char_max_len:
                 type_str = f"VARCHAR({char_max_len})"
@@ -104,7 +110,7 @@ def dump():
             null_str = "NOT NULL" if is_nullable == "NO" else "NULL"
             col_defs.append(f"    {col_name} {type_str} {null_str}")
 
-        if pk_cols:
+        if pk_cols and not any(c.startswith("    " + pk_cols[0] + " SERIAL") for c in col_defs):
             col_defs.append(f"    PRIMARY KEY ({', '.join(pk_cols)})")
 
         for uc_name, uc_cols in unique_constraints: