这是复制的样本:
import mysql.connector
conn = mysql.connector.connect(
user='root', password='12347',
host='localhost')
def getCursor():
return conn.cursor()
def execQuery(cursor=getCursor()):
cursor.execute("SELECT 2")
cursor.fetchall()
cursor.close()
for i in range(4):
cursor = execQuery()此代码不需要cursor.close()即可工作。但是,我发现奇怪的是,即使对cursor.close()进行了简单的更改,这个示例也可以工作:
def execQuery():
cursor=getCursor()
cursor.execute("SELECT 2")
cursor.fetchall()
cursor.close()通过将默认参数移动到函数的主体。
我不知道关闭游标是否是最佳实践,所以我可以跳过关闭游标,同时保留第一个表单。如果使用函数的返回值的默认参数不是最佳实践,我可以使用第二种形式。,但我想知道为什么他们的行为不同,
就好像我犯了同样的错误:
cursor.execute("SELECT 2")
cursor.fetchall()
cursor.close()
cursor.execute("SELECT 2")就像execQuery的每个调用都使用相同的游标一样,因此在第二个调用时就会被阻塞。
发布于 2017-04-05 06:56:38
当您需要连接到数据库时,您需要类似于游标的内容。您需要一个游标对象来获取结果。
在示例程序中,当您在range (4)中运行循环时,它调用execQuery()。从定义上看,您可以找到def execQuery(cursor=getCursor()):,函数以输入作为游标,默认情况下,它使用getCursor()函数,在执行循环时创建游标。
在您的程序中,您正在关闭游标,但没有再次创建游标,因此当第二个执行查询出现时,没有游标出现,程序抛出一个错误。
https://stackoverflow.com/questions/43219303
复制相似问题