diff --git a/backend/app/db/base.py b/backend/app/db/base.py index 3900dcc..52659c6 100644 --- a/backend/app/db/base.py +++ b/backend/app/db/base.py @@ -3,6 +3,7 @@ 所有子图的数据操作都用这个,避免重复代码 """ import json +import uuid from typing import Any, List, Dict, Optional from dataclasses import dataclass, asdict @@ -53,7 +54,10 @@ class BaseRepository: async def insert(self, entity: BaseEntity) -> str: """插入单个实体,返回 ID""" data = entity.to_dict() - data.pop('id', None) # 如果 id 是自增的 + + # 确保有 ID + if not data.get('id'): + data['id'] = str(uuid.uuid4()) if not data: raise ValueError("实体数据为空") @@ -71,7 +75,7 @@ class BaseRepository: async with self.conn.cursor() as cur: await cur.execute(sql, values) row = await cur.fetchone() - return row[self.id_column] if row else None + return row[self.id_column] if row else data['id'] async def update(self, entity_id: str, data: Dict[str, Any]) -> bool: """更新实体""" diff --git a/backend/app/db/init_db.py b/backend/app/db/init_db.py index 0891d99..83d51db 100644 --- a/backend/app/db/init_db.py +++ b/backend/app/db/init_db.py @@ -34,16 +34,14 @@ async def _create_contacts_table(conn): email VARCHAR(100), company VARCHAR(100), position VARCHAR(100), - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - - INDEX idx_contacts_user (user_id) + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); """ try: async with conn.cursor() as cur: await cur.execute(sql) - # 注释掉 INFO 打印,避免噪声 + await _create_index_if_not_exists(conn, "idx_contacts_user", "contacts", "user_id") except Exception as e: print(f"contacts 表可能已存在: {e}") @@ -59,16 +57,15 @@ async def _create_words_table(conn): part_of_speech VARCHAR(50), definition TEXT, examples TEXT, - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - - INDEX idx_words_user (user_id), - INDEX idx_words_word (word) + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); """ try: async with conn.cursor() as cur: await cur.execute(sql) + await _create_index_if_not_exists(conn, "idx_words_user", "words", "user_id") + await _create_index_if_not_exists(conn, "idx_words_word", "words", "word") except Exception as e: print(f"words 表可能已存在: {e}") @@ -84,14 +81,23 @@ async def _create_news_table(conn): url VARCHAR(500), source VARCHAR(100), keywords TEXT, - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - - INDEX idx_news_user (user_id) + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); """ try: async with conn.cursor() as cur: await cur.execute(sql) + await _create_index_if_not_exists(conn, "idx_news_user", "news", "user_id") except Exception as e: print(f"news 表可能已存在: {e}") + + +async def _create_index_if_not_exists(conn, index_name: str, table_name: str, column_name: str): + """创建索引(如果不存在)""" + sql = f"CREATE INDEX IF NOT EXISTS {index_name} ON {table_name} ({column_name});" + try: + async with conn.cursor() as cur: + await cur.execute(sql) + except Exception as e: + print(f"索引 {index_name} 可能已存在: {e}")