Skip to content

Repository 层

Repository 层是数据访问层,封装所有数据库查询操作。项目通过 BaseRepository 基类提供通用 CRUD 能力,子类通常只需声明类名,无需编写任何代码。

文件位置

src/modules/position/repository.py

完整代码

python
# +======================================================================
# | 模块: 岗位数据访问层
# | 说明: 定义岗位仓储,继承 BaseRepository 获得通用 CRUD 与软删除能力
# +======================================================================
"""岗位数据访问。"""

from core.base_repository import BaseRepository
from modules.position.models import Position


# ======================================================================
# 岗位仓储
# ======================================================================
class PositionRepository(BaseRepository):
    """岗位仓储。"""

    # ============================================================
    # 绑定的模型类
    # ============================================================
    model = Position

代码解析

基类继承

python
class PositionRepository(BaseRepository(Position]):

BaseRepository(Position] 是泛型基类,传入模型类型后自动获得以下能力:

方法说明
get_by_id(id)根据 ID 查询单条(自动过滤软删除)
get_by_ids(ids)根据 ID 列表查询多条
get_one(**kwargs)按等值条件查询单条(跳过 None 值)
all()按等值条件查询全部(自动过滤软删除)
exists_by_field(field, value)判断字段值是否存在
count(**kwargs)按条件计数
filter(*criterion)原始 SQLAlchemy 条件查询(不自动过滤软删除)
filter_by(**kwargs)等值条件查询(自动过滤软删除,跳过 None)
create(**kwargs)创建记录
update(id, **kwargs)更新记录
paginate(page, limit)分页查询
batch_delete(ids)批量软删除

Service 层使用方式

Repository 不需要手动创建单例。Service 层通过 repo_cls = PositionRepository 声明关联的 Repository 类,BaseService.__init__ 会自动实例化:

python
# service.py 中的使用方式
class PositionService(BaseService):
    model = Position
    repo_cls = PositionRepository  # 传入类,基类自动实例化

何时需要自定义方法

大多数简单 CRUD 模块(如 Position、Level、Category)的 Repository 只需 pass。当需要以下场景时,才在子类中添加自定义方法:

  • 复杂联表查询:如 User 需要关联 Dept、Role 查询
  • 特殊聚合查询:如统计、分组
  • 非标准查询条件:如区间查询、模糊 + 精确组合

示例(UserRepository 中的自定义方法):

python
class UserRepository(BaseRepository(User]):
    def get_by_username(self, username: str):
        """根据用户名查询用户(含角色信息)"""
        return self.filter(
            User.username == username,
            User.is_delete == 0
        ).first()

开发要点

  1. 简单模块只需声明 model:继承基类即可获得完整 CRUD 能力
  2. Service 层通过 repo_cls 关联 Repository 类:基类自动实例化,无需手动创建单例
  3. filter() 不自动过滤软删除:需要手动追加 Model.is_delete == 0 条件
  4. filter_by() / get_one() / all() 自动过滤软删除:且跳过 None 值,推荐优先使用
  5. Repository 层不做响应封装:返回 SQLAlchemy 查询结果,由 Service 层处理响应

总结

Repository 层继承 BaseRepository 获得通用 CRUD 能力,等值查询方法(get_one/get_all/filter_by)自动过滤软删除且跳过 None 值,filter() 为原始出口需手动追加软删除条件。Repository 层不做响应封装,由 Service 层处理。

小蚂蚁云团队 · 提供技术支持