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

基于FastAPI对接已有SQLite数据库实现数据查询过滤的问题

完善FastAPI中SQLite数据过滤查询功能

问题说明

当前你用FastAPI构建API,需对接已有10000+条记录的SQLite数据库实现过滤检索,但现有代码存在逻辑缺陷:当用户未传入某个过滤参数(如min_depth为None)时,对应的filter条件会生成无效的SQL判断(如deepth > NULL),导致查询结果为空。

优化后的实现代码

from typing import Optional
from sqlalchemy.orm import Session
from fastapi import Depends
import models

def show(
    min_depth: Optional[float] = None,
    max_depth: Optional[float] = None,
    min_mag: Optional[float] = None,
    max_mag: Optional[float] = None,
    lat_min: Optional[float] = None,
    lat_max: Optional[float] = None,
    long_min: Optional[float] = None,
    long_max: Optional[float] = None,
    page: int = 1,
    page_size: int = 100,
    db: Session = Depends(get_db)
):
    # 初始化查询对象
    query = db.query(models.Sismos)
    
    # 动态添加过滤条件
    if min_depth is not None:
        query = query.filter(models.Sismos.deepth > min_depth)
    if max_depth is not None:
        query = query.filter(models.Sismos.deepth < max_depth)
    if min_mag is not None:
        query = query.filter(models.Sismos.mag > min_mag)
    if max_mag is not None:
        query = query.filter(models.Sismos.mag < max_mag)
    if lat_min is not None:
        query = query.filter(models.Sismos.lat > lat_min)
    if lat_max is not None:
        query = query.filter(models.Sismos.lat < lat_max)
    if long_min is not None:
        query = query.filter(models.Sismos.lng > long_min)
    if long_max is not None:
        query = query.filter(models.Sismos.lng < long_max)
    
    # 分页处理(针对10000+条数据,避免一次性返回全部)
    total = query.count()
    sismos = query.offset((page - 1) * page_size).limit(page_size).all()
    
    return {
        "total": total,
        "page": page,
        "page_size": page_size,
        "data": sismos
    }

关键改进点

  • 动态条件拼接:仅当参数非None时才添加对应过滤条件,确保未传参数时不影响查询结果。
  • 分页支持:添加page和page_size参数,避免一次性返回上万条数据导致的性能问题,同时返回总数方便前端做分页展示。
  • 类型标注优化:用Optional[float]替代float | None,兼容更多Python版本写法。

额外性能建议

针对10000+条数据的查询效率,可在SQLite表的过滤字段(deepth、mag、lat、lng)上创建索引:

CREATE INDEX idx_sismos_deepth ON Sismos(deepth);
CREATE INDEX idx_sismos_mag ON Sismos(mag);
CREATE INDEX idx_sismos_lat ON Sismos(lat);
CREATE INDEX idx_sismos_lng ON Sismos(lng);

内容的提问来源于stack exchange,提问作者oscarmarinoa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 04:01:25