Python MySQLdb:connection.close()VS. cursor.close()

Auf*_*ind 51 python mysql-python

如果我使用MySQLdb通过Python连接到MySQL-Server.我创建了connection一个cursor这样的:

connection = MySQLdb.connect(...)
cursor = connection.cursor()
# process
Run Code Online (Sandbox Code Playgroud)

当MySQL处理完成后,应该关闭connection.现在我想知道:关闭connection这样做是否足够:

connection.close()
Run Code Online (Sandbox Code Playgroud)

或者我必须关闭第cursor一个然后关闭connection?像这样:

cursor.close()
connection.close()
Run Code Online (Sandbox Code Playgroud)

Man*_*dar 14

我将在使用MySQLdb或其他任何用于连接python2 / 3的软件包的sql连接中遇到的每个人中重申最佳实践,需要了解这一点。

(下面的模拟运行假定您的sql数据库中有一个名为tablename的表。它有4个列/字段,名称分别为field1,field2,field3,field4)。如果您的连接是本地(同一台计算机),则它是127.0.0.1,也称为“本地主机”。

该过程要简单7个步骤

  1. 建立连接
  2. 创建光标
  3. 创建查询字符串
  4. 执行查询
  5. 提交查询
  6. 关闭游标
  7. 关闭连接

这是干模拟运行的简单步骤

mydb = MySQLdb.connect(host=host, user=user, passwd=passwd, db=database, charset="utf8")
cursor = mydb.cursor()
query = "INSERT INTO tablename (text_for_field1, text_for_field2, text_for_field3, text_for_field4) VALUES (%s, %s, %s, %s)"
cursor.execute(query, (field1, field2, field3, field4))
mydb.commit()
cursor.close()
mydb.close()
Run Code Online (Sandbox Code Playgroud)

连接和光标不同。连接处于SQL级别,而游标可以视为数据元素。您可以在单个连接中的同一数据上具有多个游标。具有来自同一台计算机的相同数据的多个连接是一种不寻常的情况。

此处已描述更多信息 “游标范例并非特定于Python,而是数据库本身中经常使用的数据结构。

根据基础实现,可能会生成多个游标,它们共享与数据库的同一连接。关闭游标应该释放与查询相关的资源,包括任何从未从数据库获取(或获取但未使用)的结果,但不会消除与数据库本身的连接,因此您可以在同一数据库上获取新的游标无需再次进行身份验证。”

  • 是否必须强制关闭?如果我们不关闭它怎么办?会不会有什么影响? (3认同)

loh*_*r91 13

完成后关闭光标可能是最好的选择,因为你已经不再使用它了.但是,我没有看到在数据库连接后关闭它有害的任何事情.但是因为您可以将其设置为:

cursor = conn.cursor()
Run Code Online (Sandbox Code Playgroud)

我建议之前关闭它,以防你不小心再次分配它并关闭数据库连接,因为这会引发错误.因此,您可能需要先将其关闭,以防止意外重新分配已关闭的连接.

(有些甚至根本没有关闭它,因为它被垃圾收集器收集(参见:在Python中使用sqlite是否需要关闭游标?))

参考: 何时使用MySQLdb关闭游标

在Python中使用sqlite是否需要关闭游标?


S.L*_*ott -32

使用with,此工具允许您创建一个临时光标,一旦返回到之前的缩进级别,该临时光标将关闭。

from contextlib import closing
with closing( connection.cursor() ) as cursor:
    (indented) use the cursor

(non-indented) cursor is closed.
connection.close()
Run Code Online (Sandbox Code Playgroud)

  • 也许明确回答这个问题会更好,这样人们就不会在不知道工具在做什么和为什么的情况下就使用它。“多思考,但为了方便而使用工具”怎么样? (97认同)
  • 那么什么时候应该关闭游标呢? (5认同)
  • 这似乎不利于可读性:使用 close(connection.cursor()) 作为光标: (2认同)