Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将python变量传递给sql_Python_Python 3.x_Sqlite - Fatal编程技术网

将python变量传递给sql

将python变量传递给sql,python,python-3.x,sqlite,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) 这个很好。当我调试时

我有一个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,所以我对这方面还不熟悉

谢谢你的建议

"AND column3 = %s ",(var1_str, var2_float, var3_str)
字符串格式要求使用百分号

"AND column3 = %s " % (var1_str, var2_float, var3_str)
我并不允许在形成sql查询时使用字符串格式。如果这些值中的任何一个来自不受信任的源,那么您将面临SQL注入攻击。检查DB接口的文档,看看它是否有一种更安全的方法来包含参数

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)

谢谢,这很好用。。。而且更干净。确实正确。我的语法错了。但是,由于代码的其余部分,我仍然得到了一个错误,上面的解决方案确实通过使用“fetchall()”方法提供了解决方案。谢谢你的帮助。