【问题标题】:Python MySQL execute query loop with cursor closePython MySQL使用游标关闭执行查询循环
【发布时间】:2017-04-04 23:17:06
【问题描述】:

这是复制的样本:

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 都使用同一个游标,所以它在第二次调用时就被阻塞了。

【问题讨论】:

    标签: python mysql-python


    【解决方案1】:

    当您需要连接到数据库时,您需要光标之类的东西。您需要一个游标对象来获取结果。

    在示例程序中,当您在范围 (4) 中运行循环时,它会调用 execQuery() 。查看定义,您可以找到 def execQuery(cursor=getCursor()): 该函数将输入作为光标,默认情况下它使用 getCursor() 函数,该函数在执行循环时创建光标所有内容。

    在您的程序中,您正在关闭游标但没有再次创建它,因此当第二次执行查询出现时,没有游标存在并且程序会引发错误。

    【讨论】:

    • 感谢您的回答。我认为'当...时创建光标一切的功能'应该是'光标每次',不是吗?
    • 无论如何,根据我从您的回答中了解到的情况,每次在循环中调用 execQuery 时,它都会创建光标。然后你说我关闭光标而不是再次创建它。您是说第二次执行execQuery 时,不会创建游标,因为它已关闭?你能告诉我为什么它没有再次创建吗?
    猜你喜欢
    • 1970-01-01
    • 2018-06-01
    • 2015-02-02
    • 1970-01-01
    • 1970-01-01
    • 2015-03-08
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多