初次代码
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
# dao/users_dao.py
|
||||
# 本文件封装对 User 表的所有数据库操作(增、删、改、查)
|
||||
|
||||
from sqlalchemy.orm import Session
|
||||
from model.users import User
|
||||
from scheme.users import UserCreate, UserUpdate
|
||||
from typing import Optional, List
|
||||
|
||||
class UserDAO:
|
||||
"""用户数据访问对象,所有方法均为静态方法,方便调用"""
|
||||
|
||||
@staticmethod
|
||||
def get_all(db: Session, skip: int = 0, limit: int = 100) -> List[User]:
|
||||
"""
|
||||
获取所有用户(支持分页)
|
||||
:param db: 数据库会话
|
||||
:param skip: 偏移量(跳过前 skip 条)
|
||||
:param limit: 最大返回条数
|
||||
:return: 用户对象列表
|
||||
"""
|
||||
return db.query(User).offset(skip).limit(limit).all()
|
||||
|
||||
@staticmethod
|
||||
def get_by_id(db: Session, user_id: int) -> Optional[User]:
|
||||
"""
|
||||
根据主键 ID 获取单个用户
|
||||
:return: 用户对象或 None
|
||||
"""
|
||||
return db.query(User).filter(User.id == user_id).first()
|
||||
|
||||
@staticmethod
|
||||
def get_by_username(db: Session, username: str) -> Optional[User]:
|
||||
"""
|
||||
根据用户名获取用户(用于唯一性检查)
|
||||
"""
|
||||
return db.query(User).filter(User.username == username).first()
|
||||
|
||||
@staticmethod
|
||||
def create(db: Session, user_data: UserCreate) -> User:
|
||||
"""
|
||||
创建新用户
|
||||
:param db: 数据库会话
|
||||
:param user_data: 符合 UserCreate 模型的数据
|
||||
:return: 创建后的 User 对象(含自增 id 和默认时间)
|
||||
"""
|
||||
# 将 Pydantic 模型转为字典,并解包构建 SQLAlchemy 模型实例
|
||||
db_user = User(**user_data.model_dump())
|
||||
db.add(db_user) # 添加到会话
|
||||
db.commit() # 提交事务,此时会执行 INSERT,并自动填充自增字段
|
||||
db.refresh(db_user) # 刷新对象,获取数据库生成的默认值(如 created_at)
|
||||
return db_user
|
||||
|
||||
@staticmethod
|
||||
def update(db: Session, user_id: int, user_data: UserUpdate) -> Optional[User]:
|
||||
"""
|
||||
更新用户信息(只更新传入的非空字段)
|
||||
:param db: 数据库会话
|
||||
:param user_id: 要更新的用户 ID
|
||||
:param user_data: 包含要更新字段的 Pydantic 模型
|
||||
:return: 更新后的 User 对象,如果用户不存在则返回 None
|
||||
"""
|
||||
db_user = UserDAO.get_by_id(db, user_id)
|
||||
if not db_user:
|
||||
return None
|
||||
|
||||
# 只更新客户端显式传入的字段(exclude_unset=True 排除未设置的字段)
|
||||
update_data = user_data.model_dump(exclude_unset=True)
|
||||
for key, value in update_data.items():
|
||||
setattr(db_user, key, value) # 动态设置属性
|
||||
|
||||
db.commit() # 提交事务
|
||||
db.refresh(db_user) # 刷新对象,获取 onupdate 时间等
|
||||
return db_user
|
||||
|
||||
@staticmethod
|
||||
def delete(db: Session, user_id: int) -> bool:
|
||||
"""
|
||||
删除用户
|
||||
:return: True 表示删除成功,False 表示用户不存在
|
||||
"""
|
||||
db_user = UserDAO.get_by_id(db, user_id)
|
||||
if not db_user:
|
||||
return False
|
||||
db.delete(db_user) # 标记删除
|
||||
db.commit() # 提交事务
|
||||
return True
|
||||
Reference in New Issue
Block a user