使用 Python 3.6 的 MySQL 查询(字符串变量在单引号中)

mysql query using python 3.6 (string variable is in single quotes)

提问人:Waheed Ahmad 提问时间:5/12/2020 更新时间:5/13/2020 访问量:275

问:

我是python和mysql的新手。我在为 mysql 填充正确的查询语句时遇到问题。

    sql = "SELECT * FROM Persons WHERE %s"
    cur = db.cursor()
    cur.execute(sql,(where,))

where 是一个字符串变量,它为 WHERE 子句创建一个字符串;这是问题的重点。当我打印这个变量时,它给出以下结果:Gender = True And IsLate = False(没有任何引号),但是当我将这个变量添加到查询中以执行它时,它会在字符串周围添加单引号。 我使用了命令

    print(cur.statement) 

它打印: SELECT * FROM Persons WHERE 'Gender = True And IsLate = False' 提供参数后,将其放在单引号内,查询返回 0 行。 我已经通过将查询语句和变量连接在一起并将字符串作为查询执行来解决,这有效,

    sql = sql + where
    cur.execute(sql)

但我知道这不是专业的方式,因为我已经搜索并发现专业方法是使用参数化查询并使用变量来存储条件并在执行查询时提供它。 寻求建议,我的想法是正确的还是其他的?

MySQL 报价

评论


答:

0赞 Barmar 5/12/2020 #1

使用参数替换的全部意义在于它可以保护您免受 SQL 注入的影响。每个参数都被视为文本值,不会替换到查询中并重新解释。cursor.execute()

如果你真的希望它入,你需要使用字符串格式或串联,正如你所发现的。但是,在验证输入时必须非常小心,因为用户可能会提供您可能没有预料到的额外 SQL 代码,并导致查询出现故障。

你应该做的是动态构建字符串和参数列表。where

where = []
params = []
if gender_supplied:
    where.append('gender = %s')
    params.append(gender)
if islate_supplied:
    where.append*('islate = %s')
    params.append(islate)

sql = 'select * from persons'
if where:
    query = sql + ' where ' + ' and '.join(where)
else:
    query = sql

cur.execute(query, params)

评论

0赞 Waheed Ahmad 5/12/2020
“每个参数都被视为文本值” 我想从用户输入中收集参数值,可能是 1 或更多,这就是为什么我想将所有给定的参数连接在一个字符串中,并将其用作参数。但在这种情况下,python 在字符串两边添加单引号,使查询返回 0 行(空集)。我想要的是将字符串存储在变量中,以便它可以正确地用作参数(不带引号)。
0赞 Waheed Ahmad 5/12/2020
在当前场景中,用户输入收集了两个条件,即 1) 性别 2) IsLate 但它们可以更多
0赞 Barmar 5/13/2020
添加引号是使其成为单个文本值的方式。每个条件都需要一个单独的参数。
0赞 Barmar 5/13/2020
我已经更新了答案,以展示如何动态构造查询和使用参数。
0赞 Waheed Ahmad 5/13/2020
谢谢Barmar!我会试一试,给你反馈。