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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 06:06:05