如何在Python+Sqlite开发的API接口中实现多可选参数组合查询
动态拼接参数化查询的实现方案
核心思路是先过滤合法参数,再动态生成WHERE条件片段,全程用SQLite参数化查询避免注入风险,同时天然支持任意参数组合的请求。
具体实现步骤
- 第一步:过滤参数,仅保留你允许的四个查询字段(race、gender、age、location),避免用户传入非法参数导致SQL执行报错
- 第二步:遍历过滤后的参数,逐个生成
字段名 = ?的条件片段,同时把参数值存入单独的参数列表,全程不直接拼接用户输入到SQL字符串 - 第三步:根据是否存在条件,决定是否拼接WHERE子句到基础查询语句后
- 第四步:执行SQL时把参数列表传入,由SQLite底层处理参数转义
完整代码示例(Flask框架)
from flask import Flask, request import sqlite3 app = Flask(__name__) # 初始化数据库连接 def get_db_conn(): conn = sqlite3.connect('your_data.db') conn.row_factory = sqlite3.Row return conn @app.route('/api', methods=['GET']) def api_query(): # 允许的查询字段 allowed_fields = ['race', 'gender', 'age', 'location'] # 过滤用户传入的参数,仅保留合法字段 query_params = {k: v for k, v in request.args.items() if k in allowed_fields} conditions = [] exec_params = [] for field, val in query_params.items(): # 可选:增加参数合法性校验,避免非法值入库查询 if field == 'age': if not val.isdigit(): return {"error": "age must be a positive integer"}, 400 val = int(val) # 生成条件片段 conditions.append(f"{field} = ?") exec_params.append(val) # 拼接最终SQL base_sql = "SELECT * FROM your_table_name" if conditions: final_sql = f"{base_sql} WHERE {' AND '.join(conditions)}" else: final_sql = base_sql # 执行查询 conn = get_db_conn() rows = conn.execute(final_sql, exec_params).fetchall() conn.close() # 格式化返回结果 return {"data": [dict(row) for row in rows]} if __name__ == '__main__': app.run(port=8000, debug=True)
优势说明
- 天然支持所有参数组合的请求,无参数时默认查询全表
- 全程使用参数化查询,完全避免SQL注入风险
- 扩展性极强,后续新增查询字段仅需要在
allowed_fields里添加字段名即可,也可以很方便扩展支持范围查询、模糊查询等逻辑,比如增加age_min参数就对应生成age >= ?的条件
内容的提问来源于stack exchange,提问作者fftrash
相关产品推荐
相关产品推荐

