基于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
相关产品推荐
相关产品推荐

