refactor: define people service to CURD people

This commit is contained in:
2025-11-11 21:57:44 +08:00
parent c99b324b81
commit 496f35a386
5 changed files with 122 additions and 24 deletions

View File

@@ -1,9 +1,12 @@
# -*- coding: utf-8 -*-
# created by mmmy on 2025-09-30
import logging
from typing import Dict
from sqlalchemy import Column, Integer, String, Text, DateTime, func
from utils.rldb import RLDBBaseModel
class PeopleRLDBModel(RLDBBaseModel):
__tablename__ = 'peoples'
id = Column(String(36), primary_key=True)
@@ -20,22 +23,7 @@ class PeopleRLDBModel(RLDBBaseModel):
created_at = Column(DateTime(timezone=True), server_default=func.now(), nullable=False)
updated_at = Column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now(), nullable=False)
deleted_at = Column(DateTime(timezone=True), nullable=True, index=True)
def to_people(self) -> People:
# 将关系数据库模型转换为对象
return People(
id=self.id,
name=self.name,
contact=self.contact,
gender=self.gender,
age=self.age,
height=self.height,
marital_status=self.marital_status,
match_requirement=self.match_requirement,
introduction=self.introduction,
comments=self.comments,
cover=self.cover,
)
class People:
# 数据库 ID
@@ -82,6 +70,52 @@ class People:
f"match_requirement={self.match_requirement}, introduction={self.introduction}, "
f"comments={self.comments}, cover={self.cover})")
@classmethod
def from_dict(cls, data: dict):
if 'created_at' in data:
# 移除 created_at 字段,避免类型错误
del data['created_at']
if 'updated_at' in data:
# 移除 updated_at 字段,避免类型错误
del data['updated_at']
if 'deleted_at' in data:
# 移除 deleted_at 字段,避免类型错误
del data['deleted_at']
return cls(**data)
@classmethod
def from_rldb_model(cls, data: PeopleRLDBModel):
# 将关系数据库模型转换为对象
return cls(
id=data.id,
name=data.name,
contact=data.contact,
gender=data.gender,
age=data.age,
height=data.height,
marital_status=data.marital_status,
match_requirement=data.match_requirement,
introduction=data.introduction,
comments=data.comments,
cover=data.cover,
)
def to_dict(self) -> dict:
# 将对象转换为字典格式
return {
'id': self.id,
'name': self.name,
'contact': self.contact,
'gender': self.gender,
'age': self.age,
'height': self.height,
'marital_status': self.marital_status,
'match_requirement': self.match_requirement,
'introduction': self.introduction,
'comments': self.comments,
'cover': self.cover,
}
def to_rldb_model(self) -> PeopleRLDBModel:
# 将对象转换为关系数据库模型
return PeopleRLDBModel(

0
src/services/__init__.py Normal file
View File

64
src/services/people.py Normal file
View File

@@ -0,0 +1,64 @@
import uuid
from models.people import People, PeopleRLDBModel
from utils.error import error
from utils import rldb
class PeopleService:
def __init__(self):
self.rldb = rldb.get_instance()
def save(self, people: People) -> (str, error):
"""
保存人物到数据库和向量数据库
:param people: 人物对象
:return: 人物ID
"""
# 0. 生成 people id
people.id = people.id if people.id else uuid.uuid4().hex
# 1. 转换模型,并保存到 SQL 数据库
people_orm = people.to_rldb_model()
self.rldb.upsert(people_orm)
return people.id, error(0, "")
def delete(self, people_id: str) -> error:
"""
删除人物从数据库和向量数据库
:param people_id: 人物ID
:return: 错误对象
"""
people_orm = self.rldb.get(PeopleRLDBModel, people_id)
if not people_orm:
return error(1, f"people {people_id} not found")
self.rldb.delete(people_orm)
return error(0, "")
def list(self, conds: dict = {}, limit: int = 10, offset: int = 0) -> (list[People], error):
"""
从数据库列出人物
:param conds: 查询条件字典
:param limit: 分页大小
:param offset: 分页偏移量
:return: 人物对象列表
"""
people_orms = self.rldb.query(PeopleRLDBModel, **conds)
peoples = [People.from_rldb_model(people_orm) for people_orm in people_orms]
return peoples, error(0, "")
people_service = None
def init():
global people_service
people_service = PeopleService()
def get_instance() -> PeopleService:
return people_service

View File

@@ -13,11 +13,11 @@ class error(Protocol):
return f"{self.__class__.__name__}({self._error_code}, {self._error_info})"
@property
def error_code(self) -> int:
def code(self) -> int:
return self._error_code
@property
def error_info(self) -> str:
def info(self) -> str:
return self._error_info
@property
def is_success(self) -> bool:
def success(self) -> bool:
return self._error_code == 0

View File

@@ -49,8 +49,8 @@ class RelationalDB(Protocol):
def query(self,
model: type[RLDBBaseModel],
include_deleted: bool = False,
limit: int = 10,
offset: int = 0,
limit: int = None,
offset: int = None,
**filters
) -> list[RLDBBaseModel]:
...
@@ -102,8 +102,8 @@ class SqlAlchemyDB():
def query(self,
model: type[RLDBBaseModel],
limit: int = 10,
offset: int = 0,
limit: int = None,
offset: int = None,
**filters
) -> list[RLDBBaseModel]:
results: list[RLDBBaseModel] = []