我在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"
一样
发布于 2019-05-20 13:44:39
adr = ("Yellow Garden 2", )
这将adr
定义为只有一个元素的tuple
。您可以使用以下命令进行验证:
type(adr)
应该是:
<class 'tuple'>
当您删除逗号,
(是逗号引起的,而不是空格)时,adr
将变成一个简单的字符串:
adr = ("Yellow garden 2")
type(adr)
应该是:
<type 'str'>
MySQL应用程序接口要求将tuple
作为参数传递,因此出现错误。(soemthing,)
就是您在python中定义单元素元组的方式。
发布于 2019-05-20 13:44:49
这个答案是基于this blog post的。execute
的第二个参数是一个元组,需要一个悬空逗号,但前提是元组中只有一个元素。正如博客所讨论的,悬空逗号需要区分:
("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)
编辑:
我还要补充的是,在这里使用元组中的悬空逗号可能是最佳的编程实践。为什么?假设您编写了一些代码,这些代码最初使用了一个包含两个元素的元组。从技术上讲,您不需要悬空逗号。但是,在未来,有人可能会重构并删除一个元素。如果您没有包含悬空逗号,那么代码可能会崩溃。
发布于 2019-05-20 13:43:27
这是因为该示例使用元组( ...,)传递值
值adr =(“黄色花园2",)是包含单个值元组
如果你只需要字符串,你可以试试
sql = "SELECT * FROM customers WHERE address LIKE concat('%', %s, '%')"
adr = "Yellow Garden 2"
mycursor.execute(sql, adr)
或
mycursor.execute(sql, "Yellow Garden 2")
https://stackoverflow.com/questions/56214779
复制相似问题