统一 Repository 方案:添加 db 基类和子图模型 + 通讯录 API 支持真实数据库
Some checks failed
构建并部署 AI Agent 服务 / deploy (push) Has been cancelled
Some checks failed
构建并部署 AI Agent 服务 / deploy (push) Has been cancelled
This commit is contained in:
106
backend/app/db/models.py
Normal file
106
backend/app/db/models.py
Normal file
@@ -0,0 +1,106 @@
|
||||
"""
|
||||
子图数据模型和 Repository 定义
|
||||
只需要定义表名、实体类,基类搞定一切
|
||||
"""
|
||||
from typing import List, Optional
|
||||
from dataclasses import dataclass
|
||||
|
||||
from .base import BaseRepository, BaseEntity
|
||||
|
||||
|
||||
# ========== 通讯录 ==========
|
||||
|
||||
@dataclass
|
||||
class ContactEntity(BaseEntity):
|
||||
"""通讯录实体"""
|
||||
name: str = ""
|
||||
phone: str = ""
|
||||
email: str = ""
|
||||
company: str = ""
|
||||
position: str = ""
|
||||
|
||||
|
||||
class ContactRepository(BaseRepository):
|
||||
"""通讯录 Repository"""
|
||||
table_name = "contacts"
|
||||
entity_class = ContactEntity
|
||||
|
||||
# 如果需要特殊查询,在这里加方法
|
||||
async def search_by_name(self, user_id: str, name_keyword: str) -> List[ContactEntity]:
|
||||
"""自定义查询:按姓名搜索"""
|
||||
sql = """
|
||||
SELECT * FROM contacts
|
||||
WHERE user_id = $1 AND name ILIKE $2
|
||||
ORDER BY created_at DESC
|
||||
LIMIT 50
|
||||
"""
|
||||
result = await self.custom_query(sql, (user_id, f"%{name_keyword}%"))
|
||||
return [ContactEntity.from_dict(row) for row in result]
|
||||
|
||||
|
||||
# ========== 词典 ==========
|
||||
|
||||
@dataclass
|
||||
class WordEntity(BaseEntity):
|
||||
"""单词实体"""
|
||||
word: str = ""
|
||||
phonetic: str = ""
|
||||
part_of_speech: str = ""
|
||||
definition: str = ""
|
||||
examples: str = ""
|
||||
|
||||
|
||||
class DictionaryRepository(BaseRepository):
|
||||
"""词典 Repository"""
|
||||
table_name = "words"
|
||||
entity_class = WordEntity
|
||||
|
||||
async def search_by_word(self, user_id: str, word: str) -> Optional[WordEntity]:
|
||||
"""按单词查询"""
|
||||
sql = """
|
||||
SELECT * FROM words
|
||||
WHERE user_id = $1 AND word = $2
|
||||
LIMIT 1
|
||||
"""
|
||||
result = await self.custom_query(sql, (user_id, word))
|
||||
if result:
|
||||
return WordEntity.from_dict(result[0])
|
||||
return None
|
||||
|
||||
|
||||
# ========== 资讯 ==========
|
||||
|
||||
@dataclass
|
||||
class NewsEntity(BaseEntity):
|
||||
"""资讯实体"""
|
||||
title: str = ""
|
||||
content: str = ""
|
||||
url: str = ""
|
||||
source: str = ""
|
||||
keywords: str = ""
|
||||
|
||||
|
||||
class NewsRepository(BaseRepository):
|
||||
"""资讯 Repository"""
|
||||
table_name = "news"
|
||||
entity_class = NewsEntity
|
||||
|
||||
async def search_by_keywords(self, user_id: str, keyword: str) -> List[NewsEntity]:
|
||||
"""按关键词搜索"""
|
||||
sql = """
|
||||
SELECT * FROM news
|
||||
WHERE user_id = $1 AND (title ILIKE $2 OR keywords ILIKE $2)
|
||||
ORDER BY created_at DESC
|
||||
LIMIT 50
|
||||
"""
|
||||
result = await self.custom_query(sql, (user_id, f"%{keyword}%"))
|
||||
return [NewsEntity.from_dict(row) for row in result]
|
||||
|
||||
|
||||
# ========== 导出 ==========
|
||||
|
||||
__all__ = [
|
||||
'ContactEntity', 'ContactRepository',
|
||||
'WordEntity', 'DictionaryRepository',
|
||||
'NewsEntity', 'NewsRepository',
|
||||
]
|
||||
Reference in New Issue
Block a user