我是python和mysql的新手。我在为mysql填充正确的查询语句时遇到麻烦。
sql = "SELECT * FROM Persons WHERE %s"
cur = db.cursor()
cur.execute(sql,(where,))
哪里是一个字符串变量,它为WHERE子句创建一个字符串;这是问题的重点。当我打印此变量时,将得到以下结果:性别= True,IsLate = False(不带引号),但是当我将此变量添加到查询中以执行它时,它将在字符串周围添加单引号。我用命令
print(cur.statement)
它打印:从“性别=正确,IsLate =错误”的人员中选择*提供参数后,将其放在单引号内,查询返回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)