You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 17:45:37