Python中如何将字符串作为变量传入SQLite3数据库查询语句
问题原因
SQL 语法中的参数占位符(你代码里用的?)仅支持传入查询值,不支持传递表名、字段名这类 SQL 结构标识符,这是数据库为了避免 SQL 注入风险做的原生限制,所以你原来的写法无法生效。
修正方案
需要先对要传入的表名、字段名做白名单校验,再通过字符串格式化拼接进 SQL 语句,避免注入风险,修正后的代码示例如下:
# 提前定义允许查询的字段、表名白名单,根据你的实际业务调整 ALLOWED_COLUMNS = {"2610-48", "其他允许的字段名1", "其他允许的字段名2"} ALLOWED_TABLES = {"2610-48", "其他允许的表名1", "其他允许的表名2"} def find_model(column_name, table_name): # 先校验传入的标识符是否合法 if column_name not in ALLOWED_COLUMNS or table_name not in ALLOWED_TABLES: raise ValueError("传入的字段名或表名不合法") # 字符串格式化拼接SQL语句,用双引号包裹包含特殊字符的标识符 c.execute(f'''SELECT "{column_name}" FROM "{table_name}"''') rows = c.fetchall() for row in rows: print(row) # 注意:如果2610-48是字符串类型的名称,需要加引号,否则Python会识别为减法运算 find_model("2610-48", "2610-48")
额外注意点
- 不要省略白名单校验直接拼接用户输入的字符串到SQL中,会存在严重的SQL注入风险
- 如果你的字段名、表名包含特殊字符(比如你这里的横杠
-),拼接的时候要用双引号/反引号包裹,避免SQL语法解析错误
内容的提问来源于stack exchange,提问作者mesu
相关产品推荐
相关产品推荐

