如何在FastAPI中获取URL可选多查询参数并查询数据库?
在FastAPI中实现多可选查询参数并从数据库返回数据
FastAPI处理可选查询参数的方式非常直观,原生支持类型提示,只需给参数设置默认值None,就能让用户自由选择传入1个、2个或全部3个参数,以下是完整实现示例:
基础实现代码
from fastapi import FastAPI from sqlalchemy import create_engine, select from sqlalchemy.orm import sessionmaker # 导入你的数据库模型,这里假设你有Product模型,包含product、color、size字段 from your_module import Product app = FastAPI() # 数据库连接配置(以SQLite为例,可替换为MySQL/PostgreSQL等) engine = create_engine("sqlite:///./products.db") SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) @app.get("/createcm") def createcm(product: str | None = None, color: str | None = None, size: str | None = None): # 获取数据库会话 db = SessionLocal() try: # 初始化查询语句 query = select(Product) # 根据传入的非空参数添加过滤条件 if product: query = query.where(Product.product == product) if color: query = query.where(Product.color == color) if size: query = query.where(Product.size == size) # 执行查询并获取结果 results = db.execute(query).scalars().all() # 将ORM模型对象转为字典列表返回(方便前端解析) return [ { "product": item.product, "color": item.color, "size": item.size } for item in results ] finally: # 确保数据库会话关闭 db.close()
关键说明
- 可选参数机制:FastAPI会自动识别带有
None默认值的函数参数为可选查询参数,用户无需传入所有参数,传参组合完全自由。 - 类型提示作用:
str | None这类类型提示不仅让代码更清晰,还能让FastAPI自动生成交互式API文档(访问/docs即可查看),同时自动做参数类型校验。 - 数据库过滤逻辑:核心是只对非
None的参数添加过滤条件,这样就能精准返回用户指定组合的数据;如果用户不传任何参数,会返回所有数据。
请求示例
你可以通过以下方式发起请求,验证不同参数组合的效果:
- 仅传入product:
GET /createcm?product=shirt - 传入color和size:
GET /createcm?color=red&size=M - 传入全部三个参数:
GET /createcm?product=shirt&color=red&size=M - 不传任何参数:
GET /createcm
进阶:添加参数校验
如果需要对参数做更严格的校验(比如限制颜色可选值、限制尺寸长度),可以结合Enum和Query类实现:
from enum import Enum from fastapi import Query, FastAPI class ValidColor(str, Enum): red = "red" blue = "blue" green = "green" @app.get("/createcm") def createcm( product: str | None = None, color: ValidColor | None = None, size: str | None = Query(None, min_length=1, max_length=3) ): # 数据库查询逻辑同上 ...
这种情况下,FastAPI会自动校验参数合法性,不符合要求时返回422错误,并在API文档中展示可选参数选项。
内容的提问来源于stack exchange,提问作者Denmla
相关产品推荐
相关产品推荐

