SQLModel教程:使用FastAPI实现多模型CRUD操作
前言
在构建现代Web应用时,数据模型的设计和API的创建是两个核心环节。SQLModel作为Python生态中一个强大的工具,它结合了SQLAlchemy和Pydantic的优点,能够帮助我们高效地处理数据库操作和数据验证。本教程将展示如何使用SQLModel和FastAPI构建一个支持多模型的英雄管理API。
项目结构解析
这个示例展示了一个完整的FastAPI应用,主要包含以下几个关键部分:
- 数据模型定义
- 数据库配置
- FastAPI路由和端点
- CRUD操作实现
数据模型设计
在SQLModel中,我们可以通过继承SQLModel
类来定义数据模型。这个示例展示了如何设计一组相关的模型:
class HeroBase(SQLModel):
name: str = Field(index=True)
secret_name: str
age: Optional[int] = Field(default=None, index=True)
class Hero(HeroBase, table=True):
id: Optional[int] = Field(default=None, primary_key=True)
class HeroCreate(HeroBase):
pass
class HeroPublic(HeroBase):
id: int
模型分层设计
-
HeroBase:基础模型,包含所有英雄共有的字段
name
:英雄名称,建立索引提高查询效率secret_name
:秘密身份age
:可选年龄字段,同样建立索引
-
Hero:数据库表模型,添加了主键字段
id
,并通过table=True
标记为数据库表 -
HeroCreate:创建英雄时使用的模型,继承自HeroBase
-
HeroPublic:返回给客户端的模型,包含所有基础字段和id
这种分层设计遵循了"关注点分离"原则,使得:
- 输入验证与数据库模型分离
- 内部数据结构与公开API响应分离
- 提高了代码的可维护性和安全性
数据库配置
sqlite_file_name = "database.db"
sqlite_url = f"sqlite:///{sqlite_file_name}"
connect_args = {"check_same_thread": False}
engine = create_engine(sqlite_url, echo=True, connect_args=connect_args)
这里配置了一个SQLite数据库:
echo=True
会在控制台输出执行的SQL语句,便于调试check_same_thread=False
是SQLite在多线程环境下需要的配置
FastAPI应用初始化
app = FastAPI()
@app.on_event("startup")
def on_startup():
create_db_and_tables()
应用启动时会自动创建数据库表,这是通过FastAPI的启动事件实现的。
API端点实现
创建英雄
@app.post("/heroes/", response_model=HeroPublic)
def create_hero(hero: HeroCreate):
with Session(engine) as session:
db_hero = Hero.model_validate(hero)
session.add(db_hero)
session.commit()
session.refresh(db_hero)
return db_hero
这个端点:
- 接收HeroCreate类型的请求体
- 使用上下文管理器创建数据库会话
- 将输入数据转换为Hero模型实例
- 添加到会话并提交到数据库
- 刷新实例以获取数据库生成的id
- 返回HeroPublic类型的响应
获取英雄列表
@app.get("/heroes/", response_model=List[HeroPublic])
def read_heroes():
with Session(engine) as session:
heroes = session.exec(select(Hero)).all()
return heroes
这个端点:
- 使用SQLModel的select语句查询所有英雄
- 返回HeroPublic类型的列表
- 自动将数据库模型序列化为响应模型
技术要点总结
-
模型继承:通过继承实现DRY原则,避免重复定义字段
-
响应模型:FastAPI的
response_model
参数确保返回数据符合指定格式 -
数据库会话管理:使用上下文管理器(
with
语句)确保会话正确关闭 -
类型安全:全程使用Python类型提示,提高代码可靠性
-
自动验证:SQLModel基于Pydantic,自动处理输入数据验证
扩展思考
这种模式可以轻松扩展到更复杂的场景:
- 添加更多模型和关系
- 实现更复杂的查询
- 添加用户认证
- 实现分页和过滤
通过SQLModel和FastAPI的组合,开发者可以快速构建出类型安全、结构清晰的API服务,同时保持代码的简洁和可维护性。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考