Files
FastapiAdmin/backend/templates/python/crud.py.j2
T
zhangtao 1dc8e4f3e2 refactor(gencode): 重构代码生成模块,优化模板和查询逻辑
重构代码生成模块的模板文件,统一命名规范为下划线风格
优化GenTableQueryParam查询参数类,移除不必要的字段
修复SQLite数据库支持问题,改进表结构查询逻辑
添加数据验证处理,防止空值导致的异常
改进批量生成代码时的错误处理和参数校验
2025-10-04 23:38:42 +08:00

93 lines
4.0 KiB
Django/Jinja

# -*- coding:utf-8 -*-
from typing import List, Optional
from sqlalchemy import delete, func, select, update
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.orm import selectinload
from {{ package_name }}.model.{{ table_name }}_model import {{ table_name|snake_to_pascal_case }}Model
from {{ package_name }}.schema import {{ table_name|snake_to_pascal_case }}CreateSchema, {{ table_name|snake_to_pascal_case }}UpdateSchema
from app.core.base_crud import CRUDBase
from app.api.v1.module_system.auth.schema import AuthSchema
class {{ table_name|snake_to_pascal_case }}Dao(CRUDBase[{{ table_name|snake_to_pascal_case }}Model, {{ table_name|snake_to_pascal_case }}CreateSchema, {{ table_name|snake_to_pascal_case }}UpdateSchema]):
"""
{{ function_name }}模块数据库操作层
"""
def __init__(self, auth: AuthSchema) -> None:
"""初始化CRUD"""
super().__init__(model={{ table_name|snake_to_pascal_case }}Model, auth=auth)
async def get_{{ table_name }}_by_id(self, db: AsyncSession, {{ table_name }}_id: int):
"""
根据{{ table_name }}id获取{{ function_name }}信息
:param db: orm对象
:param {{ table_name }}_id: {{ table_name }}id
:return: {{ function_name }}信息对象
"""
{{ table_name }}_info = (
(
await db.execute(
select({{ table_name|snake_to_pascal_case }}Model)
.where({{ table_name|snake_to_pascal_case }}Model.id == {{ table_name }}_id)
)
)
.scalars()
.first()
)
return {{ table_name }}_info
async def get_{{ table_name }}_list(self, db: AsyncSession, search: {{ table_name|snake_to_pascal_case }}QueryParam = None, order_by: Optional[str] = None):
"""
根据查询参数获取{{ function_name }}列表信息
:param db: orm对象
:param search: 查询参数对象
:param order_by: 排序字段
:return: {{ function_name }}列表信息对象
"""
query = select({{ table_name|snake_to_pascal_case }}Model)
# 添加查询条件
if search and hasattr(search, '__dict__'):
for attr, value in search.__dict__.items():
if value is not None and hasattr({{ table_name|snake_to_pascal_case }}Model, attr):
if isinstance(value, tuple) and len(value) == 2:
operator, val = value
if operator == "like":
query = query.where(getattr({{ table_name|snake_to_pascal_case }}Model, attr).like(f"%{val}%"))
elif operator == "between":
query = query.where(getattr({{ table_name|snake_to_pascal_case }}Model, attr).between(val[0], val[1]))
else:
query = query.where(getattr({{ table_name|snake_to_pascal_case }}Model, attr) == val)
else:
query = query.where(getattr({{ table_name|snake_to_pascal_case }}Model, attr) == value)
# 添加排序
if order_by:
# 这里应该解析order_by参数并应用排序
query = query.order_by({{ table_name|snake_to_pascal_case }}Model.created_at.desc())
else:
query = query.order_by({{ table_name|snake_to_pascal_case }}Model.id.desc())
# 执行查询
result = await db.execute(query)
all_data = list(result.scalars().all())
return all_data
async def delete(self, db: AsyncSession, ids: List[int]) -> int:
"""
删除{{ function_name }}信息
:param db: orm对象
:param ids: {{ function_name }}id列表
:return: 删除的记录数
"""
result = await db.execute(
delete({{ table_name|snake_to_pascal_case }}Model).where({{ table_name|snake_to_pascal_case }}Model.id.in_(ids))
)
return result.rowcount