跳转至

基础用法

SQLAlchemy CRUD Plus 提供完整的 CRUD(创建、读取、更新、删除)操作。

创建记录

单条记录

# 使用 Pydantic 模型创建
user_data = UserCreate(name="张三", email="zhangsan@example.com")
user = await user_crud.create_model(session, user_data)

批量创建

# 批量创建多条记录
users_data = [
    UserCreate(name="用户1", email="user1@example.com"),
    UserCreate(name="用户2", email="user2@example.com"),
    UserCreate(name="用户3", email="user3@example.com")
]
users = await user_crud.create_models(session, users_data)

查询记录

主键查询

# 基础查询
user = await user_crud.select_model(session, pk=1)

# 结合 whereclause 位置参数
user = await user_crud.select_model(session, pk=1, user_crud.model.is_active == True)

# 结合 kwargs 关键字参数
user = await user_crud.select_model(session, pk=1, is_active=True)

条件查询

# 基础查询
user = await user_crud.select_model_by_column(session, email="zhangsan@example.com")

# 复杂查询
user = await user_crud.select_model_by_column(
    session,
    user_crud.model.is_active == True,
    email="zhangsan@example.com"
)

批量查询

# 基础查询
users = await user_crud.select_models(session)

# 使用 whereclause 位置参数
users = await user_crud.select_models(
    session,
    user_crud.model.created_time > datetime.now() - timedelta(days=7)
)

# 使用 kwargs 关键字参数
users = await user_crud.select_models(session, is_active=True, name__like="%张%")

# 分页查询
users = await user_crud.select_models(session, limit=10, offset=20)

排序查询

# 基础排序
users = await user_crud.select_models_order(session, sort_columns="created_time", sort_orders="desc")

# 多列排序
users = await user_crud.select_models_order(
    session,
    sort_columns=["name", "created_time"],
    sort_orders=["asc", "desc"]
)

# 结合过滤和分页
users = await user_crud.select_models_order(
    session,
    sort_columns="created_time",
    sort_orders="desc",
    user_crud.model.is_active == True,
    limit=10,
    name__like="%张%"
)

计数和存在检查

# 基础计数
total = await user_crud.count(session)

# 使用 whereclause 位置参数
count = await user_crud.count(session, user_crud.model.created_time > datetime.now() - timedelta(days=30))

# 使用 kwargs 关键字参数
active_count = await user_crud.count(session, is_active=True)

# 存在检查
exists = await user_crud.exists(session, email="test@example.com")

更新记录

主键更新

# 使用字典更新
updated_count = await user_crud.update_model(session, pk=1, obj={"name": "新名称"})

# 使用 Pydantic 模型
user_update = UserUpdate(name="新名称", email="new@example.com")
updated_count = await user_crud.update_model(session, pk=1, obj=user_update)

# 使用 whereclause 位置参数(额外条件)
updated_count = await user_crud.update_model(
    session,
    pk=1,
    obj={"name": "新名称"},
    user_crud.model.is_active == True
)

条件更新

# 根据条件更新单条记录
updated_count = await user_crud.update_model_by_column(
    session,
    obj={"is_active": False},
    email="user@example.com"
)

# 使用 whereclause 位置参数(额外条件)
updated_count = await user_crud.update_model_by_column(
    session,
    obj={"name": "新名称"},
    user_crud.model.is_active == True,
    email="user@example.com"
)

删除记录

主键删除

# 根据主键删除
deleted_count = await user_crud.delete_model(session, pk=1)

# 使用 whereclause 位置参数(额外条件)
deleted_count = await user_crud.delete_model(
    session,
    pk=1,
    user_crud.model.is_active == False
)

条件删除

# 根据条件删除
deleted_count = await user_crud.delete_model_by_column(
    session,
    is_active=False
)

# 使用 whereclause 位置参数(额外条件)
deleted_count = await user_crud.delete_model_by_column(
    session,
    user_crud.model.created_time < datetime.now() - timedelta(days=30),
    is_active=False
)

分页查询

# 基础分页
def paginated_users(page: int = 1, page_size: int = 20):
    offset = (page - 1) * page_size

    users = await user_crud.select_models_order(
        session,
        sort_columns="created_time",
        sort_orders="desc",
        limit=page_size,
        offset=offset
    )

    total = await user_crud.count(session)

    return {
        'users': users,
        'total': total,
        'page': page,
        'page_size': page_size,
        'total_pages': (total + page_size - 1) // page_size
    }