我正在W3school上关注Python教程。
mycursor = mydb.cursor()
sql = "SELECT * FROM customers WHERE address LIKE %s"
adr = ("Yellow Garden 2", ) // I don't understand this part!!!
mycursor.execute(sql, adr)
myresult = mycursor.fetchall()
for x in myresult:
print(x)
但是,当我在逗号后删除空格时,出现错误。
adr = ("Yellow Garden 2", )
-> adr = ("Yellow Garden 2" )
1)我想知道为什么在逗号后需要空格。
2)为什么我也需要括号()?(当我删除括号时,我也会收到错误消息。)就像adr = "Yellow Garden 2"
答案 0 :(得分:5)
adr = ("Yellow Garden 2", )
这将adr
定义为具有单个元素的tuple
。您可以通过以下方式进行验证:
type(adr)
应该是:
<class 'tuple'>
当您删除逗号,
(引起它的是逗号,而不是空格)时,adr
变成了一个简单的字符串:
adr = ("Yellow garden 2")
type(adr)
应该是:
<type 'str'>
MySQL API期望将tuple
作为参数传递,因此会出现错误。 (soemthing,)
就是您在python中定义单元素元组的方式。
答案 1 :(得分:2)
我以this blog post为基础给出了这个答案。 execute
的第二个参数是一个 tuple ,并且需要一个悬挂的逗号,但如果该元组中只有一个元素,则为 。正如博客所讨论的那样,悬空的逗号必须用来区分:
("Yellow Garden 2",)
元组,来自:
("Yellow Garden 2")
文字字符串表达式。或者,至少(1)
对于您打算将其作为元组还是算术表达式将是模棱两可的。
但是,对于两个或多个参数,悬空逗号应该是可选的,例如
sql = "SELECT * FROM customers WHERE address LIKE %s OR address LIKE %s"
adr = ("Yellow Garden 1", "Yellow Garden 2")
mycursor.execute(sql, adr)
编辑:
我还要补充一点,总是在这里在元组中使用悬挂的逗号可能被认为是最佳的编程实践。为什么?假设您编写了一些代码,该代码最初使用其中包含两个元素的元组。从技术上讲,您不需要悬挂的逗号。但是,将来,有人可能会重构并删除一个元素。如果不包含悬空逗号,则代码可能会中断。
答案 2 :(得分:1)
之所以发生这种情况,是因为该示例使用元组(...,)来传递值
值adr =(“ Yellow Garden 2”,)是一个包含单个值
如果只需要字符串,可以尝试
sql = "SELECT * FROM customers WHERE address LIKE concat('%', %s, '%')"
adr = "Yellow Garden 2"
mycursor.execute(sql, adr)
或
mycursor.execute(sql, "Yellow Garden 2")