FastAPI(Python)如何向SQL LIKE查询动态传参解决字符串格式化报错
问题原因及解决方案
报错根因
你的代码触发错误同时存在语法和安全两方面问题:
- 字符串语法冲突:你用单引号包裹的SQL语句中,
LIKE后直接使用单引号闭合,导致字符串提前截断,同时Python会把字符串内的%识别为字符串格式化占位符,没有传入对应格式化参数就会触发TypeError: not all arguments converted during string formatting - 存在SQL注入风险:直接将用户传入的参数拼接到SQL语句中,会被恶意用户构造特殊输入执行危险SQL操作,属于严重安全漏洞,绝对不建议使用字符串拼接的方式构造SQL。
正确实现方案
所有场景都推荐使用参数化查询实现动态传参,你只需要将LIKE的通配符和传入参数整合后作为查询参数传入即可,不要把通配符写在SQL模板里。
通用DBAPI驱动写法(适配pymysql、psycopg2等绝大多数Python数据库驱动)
def get_result(text : str): con = connection.connect() # SQL模板使用参数占位符,不要拼接任何用户输入 statement = 'SELECT Time, table_id, Text FROM tablename WHERE Text LIKE %s' # 提前构造带通配符的匹配参数 like_param = f'%{text}%' # 执行时将参数通过execute的第二个参数传入,单参数需要加逗号构成元组 result = con.execute(statement, (like_param,)).fetchall() con.close() return result
SQLAlchemy 写法(适配FastAPI常用的SQLAlchemy ORM/Core场景)
from sqlalchemy import text def get_result(text : str): con = connection.connect() # 使用命名参数占位符 statement = text('SELECT Time, table_id, Text FROM tablename WHERE Text LIKE :like_param') like_param = f'%{text}%' # 字典形式传入参数 result = con.execute(statement, {"like_param": like_param}).fetchall() con.close() return result
内容的提问来源于stack exchange,提问作者Ahsan
相关产品推荐
相关产品推荐

