FastAPI + 异步 SQLAlchemy 新手导包速查,解决导包对应混乱问题
摘要本文基于 FastAPI 异步 SQLAlchemy 实战项目系统梳理路由层、数据库配置层、ORM 模型层、crud 操作层、schemas 校验层、utils 工具层共六层的标准导入规范逐层给出导入语句、功能作用与完整可复用代码示例并标注 CORS 凭证冲突、default函数引用、Pydantic v2from_attributes等实战易错点可作为日常开发速查手册。目录全局总览项目分层导包速查表一、路由层导包main.py / routers 目录1.1 创建项目主应用1.2 模块化拆分路由1.3 依赖注入数据库会话1.4 接口查询参数校验1.5 HTTP 异常与状态码1.6 跨域中间件配置二、数据库配置层导包config/db_conf.py三、ORM 模型层导包models 目录3.1 基础模型基类与类型注解3.2 基础字段类型3.3 外键约束3.4 自定义索引3.5 枚举字段3.6 可选类型注解四、数据库操作层导包crud 目录4.1 普通查询 select4.2 聚合函数 func4.3 更新语句 update五、数据校验层导包schemas 目录六、全局工具层导包utils / 全局通用6.1 密码加密工具6.2 唯一 ID 生成Token6.3 时间处理全局总览项目分层导包速查表开发优先查阅此总览快速定位分层对应的所有导入无需通篇翻阅# 项目分层导包总览速查极简版 # 每层 所属目录 核心导入包 常用导入对象 1. 路由层routers / main.py 核心包fastapi 导入对象FastAPI、APIRouter、Depends、Query、HTTPException、status、CORSMiddleware 2. 数据库配置层config 核心包sqlalchemy.ext.asyncio 导入对象create_async_engine、async_sessionmaker、AsyncSession 3. 模型层models 核心包1sqlalchemy.orm 导入对象DeclarativeBase、Mapped、mapped_column 核心包2sqlalchemy 导入对象Integer、String、Text、DateTime、ForeignKey、Index、Enum 4. 数据库操作层crud 核心包1sqlalchemy 导入对象select、func、update 核心包2sqlalchemy.ext.asyncio 导入对象AsyncSession 5. 数据校验层schemas 核心包pydantic 导入对象BaseModel、ConfigDict 6. 工具层utils/全局通用 核心包1passlib.context 导入对象CryptContext 核心包2系统标准库 导入对象uuid、datetime、timedelta、typing.Optional一、路由层导包main.py / routers 目录适用场景项目主程序、所有接口路由文件负责接口创建、路由拆分、参数校验、异常处理、跨域配置1.1 创建项目主应用导入语句from fastapi import FastAPI功能作用初始化 FastAPI 主程序实例# main.pyfromfastapiimportFastAPI# 创建全局应用实例appFastAPI()1.2 模块化拆分路由导入语句from fastapi import APIRouter功能作用拆分业务模块路由统一接口前缀与接口分类标签# routers/news.pyfromfastapiimportAPIRouter# 定义新闻模块路由routerAPIRouter(prefix/api/news,tags[news])1.3 依赖注入数据库会话导入语句from fastapi import Depends功能作用全局依赖注入常用于注入数据库会话、权限校验# routers/news.pyfromfastapiimportDependsfromconfig.db_confimportget_dbfromsqlalchemy.ext.asyncioimportAsyncSession# 接口依赖数据库会话asyncdefget_categories(db:AsyncSessionDepends(get_db)):pass1.4 接口查询参数校验导入语句from fastapi import Query功能作用URL 参数校验、别名适配、数值范围限制、默认值配置# routers/news.pyfromfastapiimportQuery# 分页、分类参数校验asyncdefget_news_list(category_id:intQuery(...,aliascategoryId),page_size:intQuery(10,aliaspageSize,le100),):pass1.5 HTTP 异常与状态码导入语句from fastapi import HTTPException, status功能作用主动抛出标准 HTTP 错误统一接口异常返回格式# routers/users.pyfromfastapiimportHTTPException,status# 规范写法推荐用 status 枚举避免硬编码魔法数字raiseHTTPException(status_codestatus.HTTP_400_BAD_REQUEST,detail用户已存在)# 简写写法raiseHTTPException(status_code404,detail新闻不存在)1.6 跨域中间件配置导入语句from fastapi.middleware.cors import CORSMiddleware功能作用解决前后端联调跨域请求拦截问题# main.pyfromfastapiimportFastAPIfromfastapi.middleware.corsimportCORSMiddleware appFastAPI()# 全局跨域配置app.add_middleware(CORSMiddleware,# ⚠️ 注意allow_credentialsTrue 时浏览器禁止 Access-Control-Allow-Origin 为 *# 必须显式列出前端域名否则带 Cookie / 鉴权头的跨域请求会被浏览器直接拦截。allow_origins[http://localhost:5173,https://your-frontend.com],# 显式域名勿用 *allow_credentialsTrue,allow_methods[*],allow_headers[*],)排坑提示如果你只是本地联调、且前端不走登录态不传 Cookie / Authorization可以简化成allow_origins[*]同时把allow_credentials设为False只要二者同时满足通配 带凭证就会失效。二、数据库配置层导包config/db_conf.py适用场景仅数据库配置文件用于创建异步数据库引擎、会话工厂、全局 DB 依赖导入语句from sqlalchemy.ext.asyncio import create_async_engine, async_sessionmaker, AsyncSession功能作用适配 aiomysql 异步数据库实现非阻塞数据库连接# config/db_conf.pyfromsqlalchemy.ext.asyncioimportcreate_async_engine,async_sessionmaker,AsyncSession# 创建异步数据库引擎async_enginecreate_async_engine(mysqlaiomysql://root:123456localhost:3306/news_app?charsetutf8,echoTrue,pool_size10,max_overflow20)# 创建异步会话工厂AsyncSessionLocalasync_sessionmaker(bindasync_engine,class_AsyncSession,expire_on_commitFalse)# 全局获取数据库会话依赖函数asyncdefget_db():asyncwithAsyncSessionLocal()assession:try:yieldsessionawaitsession.commit()exceptException:# 捕获具体异常而非裸 except裸 except 会连 KeyboardInterrupt 一起吞掉awaitsession.rollback()raisefinally:awaitsession.close()小提示生产环境建议再加pool_pre_pingTrue在取出连接前做一次心跳探测自动踢掉被数据库端已断开的死连接。三、ORM 模型层导包models 目录适用场景所有数据表模型定义文件用于创建数据表结构、字段约束、索引、外键3.1 基础模型基类与类型注解导入语句from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column# models/base.pyfromdatetimeimportdatetimefromsqlalchemy.ormimportDeclarativeBase,Mapped,mapped_columnfromsqlalchemyimportDateTime# 所有模型的父类统一公共字段classBase(DeclarativeBase):# ⚠️ 关键default 必须传函数对象datetime.now不能加括号调用datetime.now()。# 加括号会在类定义时立即执行一次导致所有记录都用同一个导入时刻的时间戳。created_at:Mapped[datetime]mapped_column(DateTime,defaultdatetime.now,comment创建时间)updated_at:Mapped[datetime]mapped_column(DateTime,defaultdatetime.now,onupdatedatetime.now,comment更新时间)3.2 基础字段类型导入语句from sqlalchemy import DateTime, Integer, String, Text# models/news.pyfromdatetimeimportdatetimefromsqlalchemy.ormimportMapped,mapped_columnfromsqlalchemyimportDateTime,Integer,String,Textfrommodels.baseimportBaseclassNews(Base):__tablename__newsid:Mapped[int]mapped_column(Integer,primary_keyTrue,autoincrementTrue,comment新闻ID)title:Mapped[str]mapped_column(String(255),nullableFalse,comment新闻标题)content:Mapped[str]mapped_column(Text,nullableFalse,comment新闻内容)publish_time:Mapped[datetime]mapped_column(DateTime,defaultdatetime.now,comment发布时间)3.3 外键约束导入语句from sqlalchemy import ForeignKey# models/news.pyfromsqlalchemyimportForeignKey# 关联新闻分类表category_id:Mapped[int]mapped_column(Integer,ForeignKey(news_category.id),nullableFalse)3.4 自定义索引导入语句from sqlalchemy import Index# models/news.pyfromsqlalchemyimportIndexclassNews(Base):__tablename__news# 省略字段定义...# 数据表索引命名统一以 idx_ 前缀开头见名知意__table_args__(Index(idx_category_id,category_id),Index(idx_publish_time,publish_time))命名规范索引名统一用idx_字段名前缀外键列索引也用idx_不要混用fk_前缀避免一眼看不出它本质是索引。3.5 枚举字段导入语句from sqlalchemy import Enum as SAEnum# models/users.pyfromenumimportEnumfromtypingimportOptionalfromsqlalchemyimportEnumasSAEnumfromsqlalchemy.ormimportMapped,mapped_columnfrommodels.baseimportBaseclassGenderEnum(Enum):malemalefemalefemaleunknownunknownclassUser(Base):gender:Mapped[Optional[str]]mapped_column(SAEnum(GenderEnum),defaultGenderEnum.unknown,comment性别)3.6 可选类型注解导入语句from typing import Optional# models/news.pyfromtypingimportOptional# 可空字段定义description:Mapped[Optional[str]]mapped_column(String(500),comment新闻简介)四、数据库操作层导包crud 目录适用场景所有数据库增删改查业务逻辑文件4.1 普通查询 select导入语句from sqlalchemy import select# crud/news.pyfromsqlalchemyimportselectfromsqlalchemy.ext.asyncioimportAsyncSessionfrommodels.newsimportNewsasyncdefget_news_by_category(db:AsyncSession,category_id:int,skip:int0,limit:int10):stmtselect(News).where(News.category_idcategory_id).offset(skip).limit(limit)resultawaitdb.execute(stmt)returnresult.scalars().all()4.2 聚合函数 func导入语句from sqlalchemy import func# crud/news.pyfromsqlalchemyimportselect,funcfromsqlalchemy.ext.asyncioimportAsyncSessionfrommodels.newsimportNews# 统计分类下新闻总数asyncdefcount_news_by_category(db:AsyncSession,category_id:int):stmtselect(func.count(News.id)).where(News.category_idcategory_id)resultawaitdb.execute(stmt)returnresult.scalar_one()4.3 更新语句 update导入语句from sqlalchemy import update# crud/news.pyfromsqlalchemyimportupdatefromsqlalchemy.ext.asyncioimportAsyncSessionfrommodels.newsimportNews# 新闻浏览量自增asyncdefadd_news_view(db:AsyncSession,news_id:int):stmtupdate(News).where(News.idnews_id).values(viewsNews.views1)awaitdb.execute(stmt)awaitdb.commit()五、数据校验层导包schemas 目录适用场景定义接口请求参数、响应返回体模型自动完成数据校验导入语句from pydantic import BaseModel, ConfigDict# schemas/users.pyfrompydanticimportBaseModel,ConfigDict# 请求参数模型classUserRequest(BaseModel):username:strpassword:str# 响应返回模型classUserResponse(BaseModel):id:intusername:str# Pydantic v2 写法用 model_config ConfigDict 替代 v1 的 class Config: orm_modemodel_configConfigDict(from_attributesTrue)版本提示class Config: orm_mode True是 Pydanticv1语法。Pydanticv2已改为model_config ConfigDict(from_attributesTrue)orm_mode虽作为别名暂时可用但已废弃建议直接写新写法。本文示例统一用 v2。六、全局工具层导包utils / 全局通用6.1 密码加密工具导入语句from passlib.context import CryptContext# utils/security.pyfrompasslib.contextimportCryptContext# 初始化加密器pwd_contextCryptContext(schemes[bcrypt],deprecatedauto)# 密码哈希加密defget_password_hash(password:str):returnpwd_context.hash(password)6.2 唯一 ID 生成Token导入语句import uuid# crud/users.pyimportuuid# 生成唯一登录 Tokentokenstr(uuid.uuid4())6.3 时间处理导入语句from datetime import datetime, timedelta# crud/users.pyfromdatetimeimportdatetime,timedelta# 设置 Token 7 天过期expires_atdatetime.now()timedelta(days7)

相关新闻

AM62L硬件防火墙配置实战:从原理到寄存器级安全策略实现

AM62L硬件防火墙配置实战:从原理到寄存器级安全策略实现

1. 硬件防火墙在AM62L SoC中的核心价值与设计哲学在嵌入式系统,尤其是像德州仪器AM62L这类面向工业与汽车应用的Sitara处理器中,硬件防火墙(Hardware Firewall)绝非一个可有可无的“附加功能”,而是系统安全架构的基石…

2026/7/19 2:45:27阅读更多 →
朴素贝叶斯原理与实战:小样本、高实时、强解释的分类利器

朴素贝叶斯原理与实战:小样本、高实时、强解释的分类利器

1. 项目概述:朴素贝叶斯不是“朴素”的凑合,而是有底气的极简主义你有没有遇到过这样的场景:手头只有几百条带标签的客户投诉文本,要快速搭建一个能自动分类“物流问题”“产品质量”“售后服务”的模型;或者在嵌入式设…

2026/7/19 2:45:27阅读更多 →
UE5自研Motion Warping系统:从原理到实战的动画根运动控制方案

UE5自研Motion Warping系统:从原理到实战的动画根运动控制方案

1. 项目概述:为什么我们需要自己动手造轮子?Motion Warping(运动扭曲)是UE5动画系统里一个相当酷炫的功能,它允许你在动画播放过程中,动态地调整角色的根骨骼位置和朝向,从而实现诸如“在奔跑中…

2026/7/19 2:45:27阅读更多 →
Android开源库发布JCenter全流程指南

Android开源库发布JCenter全流程指南

1. 开源库发布到JCenter的核心价值作为一名长期维护Android开源项目的开发者,我深刻体会到将库发布到JCenter的重要性。JCenter作为Android开发领域的默认仓库,其优势主要体现在三个方面:首先,依赖管理效率提升显著。当你的库被集…

2026/7/19 5:43:43阅读更多 →
C++消息处理框架设计:从同步到异步的实战实现

C++消息处理框架设计:从同步到异步的实战实现

1. 项目概述:为什么我们需要一个自己的消息处理框架?在C后端开发或者游戏服务器开发中,消息处理是一个绕不开的核心模块。无论是网络数据包、用户操作指令、系统内部事件,还是模块间的通信,本质上都是消息的传递与处理…

2026/7/19 5:43:43阅读更多 →
AI搜索时代,品牌如何被AI主动推荐?正飞GEO的五大核心优势

AI搜索时代,品牌如何被AI主动推荐?正飞GEO的五大核心优势

2026年,用户获取信息的方式正在发生根本性变化。 过去,用户打开百度搜索关键词,浏览搜索结果页,点击链接进入官网。现在,用户打开豆包、DeepSeek、Kimi,直接问一个问题——“XX行业哪家靠谱”“XX产品怎么样…

2026/7/19 5:43:43阅读更多 →
STM32与ADS1292 SPI通信及ECG信号处理实战

STM32与ADS1292 SPI通信及ECG信号处理实战

1. ADS1292芯片与源码解析概述ADS1292是TI推出的一款低功耗、高精度生物电势测量前端芯片,专为ECG(心电图)和EEG(脑电图)等医疗应用设计。这款芯片集成了两个24位Δ-Σ ADC通道、可编程增益放大器(PGA)和内部参考电压源,能够直接连接电极采集微弱的生物电…

2026/7/19 5:43:43阅读更多 →
JavaMail实战:协议支持、性能优化与企业级应用

JavaMail实战:协议支持、性能优化与企业级应用

1. JavaMail核心功能与协议支持解析JavaMail作为Java平台处理电子邮件的标准API,其设计初衷是提供一套与邮件服务器协议无关的编程接口。我在实际项目中多次使用JavaMail处理企业级邮件系统集成,发现其协议抽象层设计得非常巧妙。核心jar包javax.mail.ja…

2026/7/19 5:43:43阅读更多 →
kubectl taint node node1.org study=nohard:NoSchedule

kubectl taint node node1.org study=nohard:NoSchedule

[rootmaster1 workload]# kubectl get node node1.org -o yaml |grep taint -iA 10 taints: effect: NoSchedule key: study value: nohardeffect: NoSchedule key: title value: sre status: addresses:address: 192.168.3.63 type: InternalIP 复制代码 复制代码 [rootmast…

2026/7/19 5:41:42阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/19 0:01:04阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/19 0:01:04阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/19 0:01:04阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/19 0:01:04阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/19 0:01:04阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/19 0:01:04阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/18 22:49:46阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/18 14:49:24阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/18 18:49:35阅读更多 →