我有一个python脚本,我想从数据库中提取数据到列表,然后打印出来。
以下是代码:
sql = "SELECT * FROM example WHERE column1 == 'string_value' AND column2 = float_value AND column3 == 'string_value'"
# Assemble list.
query = []
for row in c.execute(sql):
query.append(row)
这很好。当我调试时,我看到sql是一个字符串,循环运行正常并组装列表。但是,当我尝试使用字符串格式化为sql查询列值使用变量时:
sql = "SELECT * FROM example WHERE column1 = %s AND column2 = %s AND column3 = %s ",(var1_str, var2_float, var3_str)
我得到了:
for row in c.execute(sql):
ValueError: operation parameter must be str
我无法运行循环来组装列表。调试这个我看到' sql'现在是一个元组,而不是一个字符串。为什么? 有没有比我正在使用的更好的方法来做到这一点。这是我第一次尝试使用SQL和Python,所以我对此不熟悉。
感谢您的任何建议。
答案 0 :(得分:2)
ValueError:操作参数必须为str
正在发生的事情是sql
变量是一个元组,但execute()
期望看到一个字符串作为第一个位置参数。您的意思是参数化查询,方法是将查询参数分别传递给execute()
:
sql = "SELECT * FROM example WHERE column1 = %s AND column2 = %s AND column3 = %s "
c.execute(sql, (var1_str, var2_float, var3_str))
for row in c.fetchall():
query.append(row)
答案 1 :(得分:1)
"AND column3 = %s ",(var1_str, var2_float, var3_str)
字符串格式化需要百分号。
"AND column3 = %s " % (var1_str, var2_float, var3_str)
在形成sql查询时,我并不宽容使用字符串格式。如果这些值中的任何一个来自不受信任的来源,那么您将面临SQL注入攻击。检查数据库接口的文档,看看它是否有更安全的方法来包含参数。