将python变量传递给sql

时间:2016-01-08 18:53:31

标签: python python-3.x sqlite

我有一个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,所以我对此不熟悉。

感谢您的任何建议。

2 个答案:

答案 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注入攻击。检查数据库接口的文档,看看它是否有更安全的方法来包含参数。