Python中带有悬挂逗号的Where子句

时间:2019-05-20 05:33:33

标签: python mysql

我正在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)

如果运行上面的代码,则会得到以下结果。
enter image description here

但是,当我在逗号后删除空格时,出现错误。
adr = ("Yellow Garden 2", )-> adr = ("Yellow Garden 2" )

1)我想知道为什么在逗号后需要空格。

2)为什么我也需要括号()?(当我删除括号时,我也会收到错误消息。)就像adr = "Yellow Garden 2"

3 个答案:

答案 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")