语法优化,并新增支持会话过期

This commit is contained in:
ktianc 2024-01-21 10:51:55 +08:00
parent ebc0095ca6
commit 244da5fdd5
2 changed files with 43 additions and 39 deletions

View File

@ -16,12 +16,11 @@ from fastapi import HTTPException
from fastapi.encoders import jsonable_encoder from fastapi.encoders import jsonable_encoder
from sqlalchemy import func, delete, update, BinaryExpression, ScalarResult, select, false, insert from sqlalchemy import func, delete, update, BinaryExpression, ScalarResult, select, false, insert
from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.orm import InstrumentedAttribute
from sqlalchemy.orm.strategy_options import _AbstractLoad from sqlalchemy.orm.strategy_options import _AbstractLoad
from starlette import status from starlette import status
from core.exception import CustomException from core.exception import CustomException
from sqlalchemy.sql.selectable import Select as SelectType from sqlalchemy.sql.selectable import Select as SelectType
from typing import Any, List, Union from typing import Any, Union
class DalBase: class DalBase:
@ -37,20 +36,20 @@ class DalBase:
self, self,
data_id: int = None, data_id: int = None,
v_start_sql: SelectType = None, v_start_sql: SelectType = None,
v_select_from: List[Any] = None, v_select_from: list[Any] = None,
v_join: List[Any] = None, v_join: list[Any] = None,
v_outer_join: List[Any] = None, v_outer_join: list[Any] = None,
v_options: List[_AbstractLoad] = None, v_options: list[_AbstractLoad] = None,
v_where: List[BinaryExpression] = None, v_where: list[BinaryExpression] = None,
v_order: str = None, v_order: str = None,
v_order_field: str = None, v_order_field: str = None,
v_return_none: bool = False, v_return_none: bool = False,
v_schema: Any = None, v_schema: Any = None,
v_expire_all: bool = False,
**kwargs **kwargs
) -> Any: ) -> Any:
""" """
获取单个数据默认使用 ID 查询否则使用关键词查询 获取单个数据默认使用 ID 查询否则使用关键词查询
:param data_id: 数据 ID :param data_id: 数据 ID
:param v_start_sql: 初始 sql :param v_start_sql: 初始 sql
:param v_select_from: 用于指定查询从哪个表开始通常与 .join() 等方法一起使用 :param v_select_from: 用于指定查询从哪个表开始通常与 .join() 等方法一起使用
@ -62,9 +61,13 @@ class DalBase:
:param v_order_field: 排序字段 :param v_order_field: 排序字段
:param v_return_none: 是否返回空 None否认 抛出异常默认抛出异常 :param v_return_none: 是否返回空 None否认 抛出异常默认抛出异常
:param v_schema: 指定使用的序列化对象 :param v_schema: 指定使用的序列化对象
:param v_expire_all: 使当前会话Session中所有已加载的对象过期确保您获取的是数据库中的最新数据但可能会有性能损耗博客https://blog.csdn.net/k_genius/article/details/135490378
:param kwargs: 查询参数 :param kwargs: 查询参数
:return: 默认返回 ORM 对象如果存在 v_schema 则会返回 v_schema 结果 :return: 默认返回 ORM 对象如果存在 v_schema 则会返回 v_schema 结果
""" """
if v_expire_all:
self.db.expire_all()
if not isinstance(v_start_sql, SelectType): if not isinstance(v_start_sql, SelectType):
v_start_sql = select(self.model).where(self.model.is_delete == false()) v_start_sql = select(self.model).where(self.model.is_delete == false())
@ -105,11 +108,11 @@ class DalBase:
page: int = 1, page: int = 1,
limit: int = 10, limit: int = 10,
v_start_sql: SelectType = None, v_start_sql: SelectType = None,
v_select_from: List[Any] = None, v_select_from: list[Any] = None,
v_join: List[Any] = None, v_join: list[Any] = None,
v_outer_join: List[Any] = None, v_outer_join: list[Any] = None,
v_options: List[_AbstractLoad] = None, v_options: list[_AbstractLoad] = None,
v_where: List[BinaryExpression] = None, v_where: list[BinaryExpression] = None,
v_order: str = None, v_order: str = None,
v_order_field: str = None, v_order_field: str = None,
v_return_count: bool = False, v_return_count: bool = False,
@ -117,11 +120,11 @@ class DalBase:
v_return_objs: bool = False, v_return_objs: bool = False,
v_schema: Any = None, v_schema: Any = None,
v_distinct: bool = False, v_distinct: bool = False,
v_expire_all: bool = False,
**kwargs **kwargs
) -> Union[List[Any], ScalarResult, tuple]: ) -> Union[list[Any], ScalarResult, tuple]:
""" """
获取数据列表 获取数据列表
:param page: 页码 :param page: 页码
:param limit: 当前页数据量 :param limit: 当前页数据量
:param v_start_sql: 初始 sql :param v_start_sql: 初始 sql
@ -137,9 +140,13 @@ class DalBase:
:param v_return_objs: 是否返回对象 :param v_return_objs: 是否返回对象
:param v_schema: 指定使用的序列化对象 :param v_schema: 指定使用的序列化对象
:param v_distinct: 是否结果去重 :param v_distinct: 是否结果去重
:param v_expire_all: 使当前会话Session中所有已加载的对象过期确保您获取的是数据库中的最新数据但可能会有性能损耗博客https://blog.csdn.net/k_genius/article/details/135490378
:param kwargs: 查询参数使用的是自定义表达式 :param kwargs: 查询参数使用的是自定义表达式
:return: 返回值优先级v_return_scalars > v_return_objs > v_schema :return: 返回值优先级v_return_scalars > v_return_objs > v_schema
""" """
if v_expire_all:
self.db.expire_all()
sql: SelectType = await self.filter_core( sql: SelectType = await self.filter_core(
v_start_sql=v_start_sql, v_start_sql=v_start_sql,
v_select_from=v_select_from, v_select_from=v_select_from,
@ -189,15 +196,14 @@ class DalBase:
async def get_count( async def get_count(
self, self,
v_select_from: List[Any] = None, v_select_from: list[Any] = None,
v_join: List[Any] = None, v_join: list[Any] = None,
v_outer_join: List[Any] = None, v_outer_join: list[Any] = None,
v_where: List[BinaryExpression] = None, v_where: list[BinaryExpression] = None,
**kwargs **kwargs
) -> int: ) -> int:
""" """
获取数据总数 获取数据总数
:param v_select_from: 用于指定查询从哪个表开始通常与 .join() 等方法一起使用 :param v_select_from: 用于指定查询从哪个表开始通常与 .join() 等方法一起使用
:param v_join: 创建内连接INNER JOIN操作返回两个表中满足连接条件的交集 :param v_join: 创建内连接INNER JOIN操作返回两个表中满足连接条件的交集
:param v_outer_join: 用于创建外连接OUTER JOIN操作返回两个表中满足连接条件的并集包括未匹配的行并用 NULL 值填充 :param v_outer_join: 用于创建外连接OUTER JOIN操作返回两个表中满足连接条件的并集包括未匹配的行并用 NULL 值填充
@ -220,7 +226,7 @@ class DalBase:
async def create_data( async def create_data(
self, self,
data, data,
v_options: List[_AbstractLoad] = None, v_options: list[_AbstractLoad] = None,
v_return_obj: bool = False, v_return_obj: bool = False,
v_schema: Any = None v_schema: Any = None
) -> Any: ) -> Any:
@ -238,12 +244,11 @@ class DalBase:
await self.flush(obj) await self.flush(obj)
return await self.out_dict(obj, v_options, v_return_obj, v_schema) return await self.out_dict(obj, v_options, v_return_obj, v_schema)
async def create_datas(self, datas: List[dict]) -> None: async def create_datas(self, datas: list[dict]) -> None:
""" """
批量创建数据 批量创建数据
SQLAlchemy 2.0 批量插入不支持 MySQL 返回值 SQLAlchemy 2.0 批量插入不支持 MySQL 返回值
https://docs.sqlalchemy.org/en/20/orm/queryguide/dml.html#getting-new-objects-with-returning https://docs.sqlalchemy.org/en/20/orm/queryguide/dml.html#getting-new-objects-with-returning
:param datas: 字典数据列表 :param datas: 字典数据列表
""" """
await self.db.execute(insert(self.model), datas) await self.db.execute(insert(self.model), datas)
@ -253,7 +258,7 @@ class DalBase:
self, self,
data_id: int, data_id: int,
data: Any, data: Any,
v_options: List[_AbstractLoad] = None, v_options: list[_AbstractLoad] = None,
v_return_obj: bool = False, v_return_obj: bool = False,
v_schema: Any = None v_schema: Any = None
) -> Any: ) -> Any:
@ -272,7 +277,7 @@ class DalBase:
await self.flush(obj) await self.flush(obj)
return await self.out_dict(obj, None, v_return_obj, v_schema) return await self.out_dict(obj, None, v_return_obj, v_schema)
async def delete_datas(self, ids: List[int], v_soft: bool = False, **kwargs) -> None: async def delete_datas(self, ids: list[int], v_soft: bool = False, **kwargs) -> None:
""" """
删除多条数据 删除多条数据
:param ids: 数据集 :param ids: 数据集
@ -301,14 +306,14 @@ class DalBase:
self.db.add(obj) self.db.add(obj)
await self.db.flush() await self.db.flush()
if obj: if obj:
# 使用 get_data 或者 get_datas 获取到实例后如更新了实例,并需要序列化实例,那么需要执行 refresh 刷新才能正常序列化 # 使用 get_data 或者 get_datas 获取到实例后如更新了实例,并需要序列化实例,那么需要执行 refresh 刷新才能正常序列化
await self.db.refresh(obj) await self.db.refresh(obj)
return obj return obj
async def out_dict( async def out_dict(
self, self,
obj: Any, obj: Any,
v_options: List[_AbstractLoad] = None, v_options: list[_AbstractLoad] = None,
v_return_obj: bool = False, v_return_obj: bool = False,
v_schema: Any = None v_schema: Any = None
) -> Any: ) -> Any:
@ -331,11 +336,11 @@ class DalBase:
async def filter_core( async def filter_core(
self, self,
v_start_sql: SelectType = None, v_start_sql: SelectType = None,
v_select_from: List[Any] = None, v_select_from: list[Any] = None,
v_join: List[Any] = None, v_join: list[Any] = None,
v_outer_join: List[Any] = None, v_outer_join: list[Any] = None,
v_options: List[_AbstractLoad] = None, v_options: list[_AbstractLoad] = None,
v_where: List[BinaryExpression] = None, v_where: list[BinaryExpression] = None,
v_order: str = None, v_order: str = None,
v_order_field: str = None, v_order_field: str = None,
v_return_sql: bool = False, v_return_sql: bool = False,
@ -343,7 +348,6 @@ class DalBase:
) -> Union[ScalarResult, SelectType]: ) -> Union[ScalarResult, SelectType]:
""" """
数据过滤核心功能 数据过滤核心功能
:param v_start_sql: 初始 sql :param v_start_sql: 初始 sql
:param v_select_from: 用于指定查询从哪个表开始通常与 .join() 等方法一起使用 :param v_select_from: 用于指定查询从哪个表开始通常与 .join() 等方法一起使用
:param v_join: 创建内连接INNER JOIN操作返回两个表中满足连接条件的交集 :param v_join: 创建内连接INNER JOIN操作返回两个表中满足连接条件的交集
@ -388,12 +392,13 @@ class DalBase:
def add_relation( def add_relation(
self, self,
v_start_sql: SelectType, v_start_sql: SelectType,
v_select_from: List[Any] = None, v_select_from: list[Any] = None,
v_join: List[Any] = None, v_join: list[Any] = None,
v_outer_join: List[Any] = None, v_outer_join: list[Any] = None,
v_options: List[_AbstractLoad] = None, v_options: list[_AbstractLoad] = None,
) -> SelectType: ) -> SelectType:
""" """
关系查询关系加载
:param v_start_sql: 初始 sql :param v_start_sql: 初始 sql
:param v_select_from: 用于指定查询从哪个表开始通常与 .join() 等方法一起使用 :param v_select_from: 用于指定查询从哪个表开始通常与 .join() 等方法一起使用
:param v_join: 创建内连接INNER JOIN操作返回两个表中满足连接条件的交集 :param v_join: 创建内连接INNER JOIN操作返回两个表中满足连接条件的交集
@ -439,7 +444,7 @@ class DalBase:
sql = sql.where(*conditions) sql = sql.where(*conditions)
return sql return sql
def __dict_filter(self, **kwargs) -> List[BinaryExpression]: def __dict_filter(self, **kwargs) -> list[BinaryExpression]:
""" """
字典过滤 字典过滤
:param model: :param model:

View File

@ -11,7 +11,6 @@
""" """
import datetime import datetime
from typing import Annotated, Any from typing import Annotated, Any
from bson import ObjectId from bson import ObjectId
from pydantic import AfterValidator, PlainSerializer, WithJsonSchema from pydantic import AfterValidator, PlainSerializer, WithJsonSchema
from .validator import * from .validator import *