Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.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_Sql - Fatal编程技术网

如何在Python中使用SQL语句中的变量?

如何在Python中使用SQL语句中的变量?,python,sql,Python,Sql,好的,所以我对Python没有太多经验 我有以下Python代码: cursor.execute("INSERT INTO table VALUES var1, var2, var3,") 其中var1是整数,var2和var3是字符串 如果python不将变量名作为查询文本的一部分,如何编写变量名 cursor.execute("INSERT INTO table VALUES (%s, %s, %s)", (var1, var2, var3)) 请注意,参数是作为元组传递的 数据库API

好的,所以我对Python没有太多经验

我有以下Python代码:

cursor.execute("INSERT INTO table VALUES var1, var2, var3,")
其中var1是整数,var2和var3是字符串

如果python不将变量名作为查询文本的一部分,如何编写变量名

cursor.execute("INSERT INTO table VALUES (%s, %s, %s)", (var1, var2, var3))
请注意,参数是作为元组传递的

数据库API对变量进行正确的转义和引用。注意不要使用字符串格式运算符%,因为

它不做任何转义或引用。 它容易受到不受控制的字符串格式攻击,例如。 在语句中添加变量值时要小心: 想象一个用户给自己命名';删除表用户;'- 这就是为什么需要使用sql转义的原因,当您以适当的方式使用cursor.execute时,Python会为您提供sql转义。url中的示例是:

cursor.execute("insert into Attendees values (?, ?, ?)", (name,
seminar, paid) )

Python DB-API的不同实现允许使用不同的占位符,因此您需要找出您正在使用的占位符,例如MySQLdb:

cursor.execute("INSERT INTO table VALUES (%s, %s, %s)", (var1, var2, var3))
或者,例如,使用Python标准库中的sqlite3:

cursor.execute("INSERT INTO table VALUES (?, ?, ?)", (var1, var2, var3))
或者其他值后面的值,您可以有:1、:2、:3或命名样式:fee、:fie、:fo或%fees、%fies、%fos,其中传递dict而不是map作为要执行的第二个参数。检查正在使用的DB API模块中的paramstyle字符串常量,并在中查找paramstyle,以查看所有参数传递样式

有很多方法。在实际代码中,不要使用最明显的%s和%,它是开放的

此处复制粘贴:

永远不要这样做-不安全! 符号='RHAT' c、 executeSELECT*从符号=“%s”%symbol的库存中选择 改为这样做 t='RHAT', c、 执行'SELECT*FROM stocks WHERE symbol=?',t 打印c.fetchone 一次插入多条记录的较大示例 购买量=['2006-03-28','BUY','IBM',1000,45.00, “2006-04-05”、“购买”、“MSFT”、1000、72.00、, “2006-04-06”、“出售”、“IBM”、500、53.00、, ] c、 executemany'在股票中插入价值?,,,,,,,,,,,,购买 如果需要,请提供更多示例:


对于没有经验的Python用户来说,提供单个值的语法可能会令人困惑

给定查询

插入mytable水果值%s 传递给cursor.execute的值必须仍然是,即使它是单元素,所以我们必须提供一个单元素元组,如下所示:value

cursor.executeINSERT插入mytable水果值%s,'apple',
有趣的是,为什么它单独使用变量而不是在数组var1、var2、var3中工作?根据DB API规范,它看起来可以是任意一种方式:@thekashyap请仔细阅读。使用字符串格式运算符%是不安全的。事实上,我在回答中是这样说的。。我想象的是字符串和变量之间的%而不是。。由于种种原因,我无法撤消我的否决票。。我个人希望看到描述中提到的不安全/攻击等词,其中您说不要使用%..@eric答案说不要使用%运算符格式化字符串。字符串中的%正被cursor.execute直接使用,因为它知道它正在生成SQL,所以它可以做更多的工作来保护您。实际上,这不是SQL转义。它是变量绑定,更简单、更直接。解析后,这些值会绑定到SQL语句中,使其免受任何注入攻击。那么,是SQL转义还是变量绑定取决于数据库服务器/DB-API驱动程序的好坏。我见过一些现实世界中广泛部署的生产数据库,它们的DB-API驱动程序只是进行转义,而不是将数据和代码保留在线路上的带外。不用说,我不太尊重那些所谓的数据库。一些DB-API实现实际上使用%s作为变量,最明显的是psycopg2 for PostgreSQL。这一点不必混淆,尽管使用%s和%运算符替换字符串很容易。如果为了可移植性,我们可以定义一种为DB-API指定SQL参数的标准方法,我会非常高兴。除了使用外部SQL脚本之外,是否可以做同样的事情?
# Multiple values single statement/execution
c.execute('SELECT * FROM stocks WHERE symbol=? OR symbol=?', ('RHAT', 'MSO'))
print c.fetchall()
c.execute('SELECT * FROM stocks WHERE symbol IN (?, ?)', ('RHAT', 'MSO'))
print c.fetchall()
# This also works, though ones above are better as a habit as it's inline with syntax of executemany().. but your choice.
c.execute('SELECT * FROM stocks WHERE symbol=? OR symbol=?', 'RHAT', 'MSO')
print c.fetchall()
# Insert a single item
c.execute('INSERT INTO stocks VALUES (?,?,?,?,?)', ('2006-03-28', 'BUY', 'IBM', 1000, 45.00))