mysql query using python 3.6 (string variable is in single quotes)
mysql query using python 3.6 (string variable is in single quotes)
我是 python 和 mysql 的新人。我在为 mysql.
填充正确的查询语句时遇到问题
sql = "SELECT * FROM Persons WHERE %s"
cur = db.cursor()
cur.execute(sql,(where,))
where 是一个字符串变量,它为 WHERE 子句创建一个字符串;这就是问题所在。当我打印这个变量时,它给出以下结果:
性别 = True 并且 IsLate = False
(没有任何引号)但是当我将此变量添加到查询以执行它时,它会在字符串周围添加单引号。
我使用了命令
print(cur.statement)
并打印:
SELECT * 来自 'Gender = True And IsLate = False' 的人
提供参数后,它将其放在单引号内并查询 returns 0 行。
我通过将查询语句和变量连接在一起并执行字符串作为查询来解决问题,
sql = sql + where
cur.execute(sql)
但我知道这不是专业的方法,因为我搜索并发现专业的方法是使用参数化查询并使用变量来存储条件并在执行查询时提供它。
寻求建议,我的想法是否正确?
在 cursor.execute()
中使用参数替换的全部意义在于它可以保护您免受 SQL 注入。每个参数都被视为文字值,不会代入查询并重新解释。
如果您真的希望它被解释,您需要使用字符串格式化或连接,正如您发现的那样。但是随后您在验证输入时必须非常小心,因为用户可以提供您可能没有预料到的额外 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)
我是 python 和 mysql 的新人。我在为 mysql.
填充正确的查询语句时遇到问题 sql = "SELECT * FROM Persons WHERE %s"
cur = db.cursor()
cur.execute(sql,(where,))
where 是一个字符串变量,它为 WHERE 子句创建一个字符串;这就是问题所在。当我打印这个变量时,它给出以下结果: 性别 = True 并且 IsLate = False (没有任何引号)但是当我将此变量添加到查询以执行它时,它会在字符串周围添加单引号。 我使用了命令
print(cur.statement)
并打印: SELECT * 来自 'Gender = True And IsLate = False' 的人 提供参数后,它将其放在单引号内并查询 returns 0 行。 我通过将查询语句和变量连接在一起并执行字符串作为查询来解决问题,
sql = sql + where
cur.execute(sql)
但我知道这不是专业的方法,因为我搜索并发现专业的方法是使用参数化查询并使用变量来存储条件并在执行查询时提供它。 寻求建议,我的想法是否正确?
在 cursor.execute()
中使用参数替换的全部意义在于它可以保护您免受 SQL 注入。每个参数都被视为文字值,不会代入查询并重新解释。
如果您真的希望它被解释,您需要使用字符串格式化或连接,正如您发现的那样。但是随后您在验证输入时必须非常小心,因为用户可以提供您可能没有预料到的额外 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)