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

时间:2011-03-31 18:09:10

标签: python mysql-python

如果我使用MySQLdb通过Python连接到MySQL-Server。我创建了connectioncursor,如下所示:

connection = MySQLdb.connect(...)
cursor = connection.cursor()
# process

完成MySQL处理后,应关闭connection。现在我想知道:通过这样做来关闭connection是否足够:

connection.close()

或者我必须先关闭cursor,然后关闭connection吗?像这样:

cursor.close()
connection.close()

4 个答案:

答案 0 :(得分:11)

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

cursor = conn.cursor()

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

(有些甚至根本没有关闭它,因为它被垃圾收集器收集(参见:In Python with sqlite is it necessary to close a cursor?))

参考文献: When to close cursors using MySQLdb

In Python with sqlite is it necessary to close a cursor?

答案 1 :(得分:5)

对于使用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()

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

已描述了更多here “游标范例不是特定于Python的,而是数据库本身中经常使用的数据结构。

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

答案 2 :(得分:3)

在此特定上下文中,关闭连接应该足够好。 如果您正在使用多个游标等,则需要关注正确的资源管理。

答案 3 :(得分:-21)

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

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

(non-indented) cursor is closed.
connection.close()