Python MySQLdb: connection.close() VS. cursor.close() Python MySQLdb中的connection.close()与cursor.close()的区别

116

如果我使用MySQLdb通过Python连接到MySQL-Server。 我可以像这样创建一个connectioncursor

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

在 MySQL 处理完成后,应该关闭 connection。现在我想知道:只需要执行以下操作关闭 connection 是否足够:

connection.close()

还是说我必须先关闭 cursor 然后再关闭 connection?就像这样:

cursor.close()
connection.close()

3
相关的问题是,只关闭游标而不关闭连接,这样做可以吗? - Susheel Javadi
4个回答

110

我会在这里向每个使用MySQLdb或任何其他包连接Python2/3的人重申最佳实践,请您注意:

(以下模拟运行假设您在SQL数据库中有一个名为tablename的表,它有4个名为field1、field2、field3和field4的列/字段。如果您的连接是本地连接(同一台计算机),则IP地址是127.0.0.1,也称为“localhost”)。

这个过程可以简单地概括为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级别,而游标可以被视为数据元素。您可以在单个连接内对同一数据拥有多个游标。从同一台计算机到同一数据拥有多个连接是不寻常的情况。

更多信息可以在这里找到。 “游标范式并不特定于Python,但在数据库本身中是一个频繁使用的数据结构。”

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


3
关闭它是强制性的吗?如果我们不关闭它会怎样?这会影响到什么吗? - curiouscheese
不是必须的。但如果你要运行多个查询的循环,那么是的!在生产环境中,请关闭游标。 - Mandar

19

在你完成使用游标后立即关闭它可能是最好的选择,因为你不再需要它了。然而,我没有看到任何关闭连接后关闭游标会有什么危害。但是,你可以将其设置为:

cursor = conn.cursor()

为避免意外重新分配并关闭数据库连接导致错误,建议您在使用前先将其关闭。因此,您可能需要首先关闭它,以防止意外重新分配已关闭的连接。

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

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

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


2
在这种特定的情况下,关闭连接应该足够了。如果您正在使用多个游标等,则需要关注适当的资源管理。

-31
使用with,这个工具允许你创建一个临时的游标,在你返回到之前的缩进级别时将被关闭。
from contextlib import closing
with closing( connection.cursor() ) as cursor:
    (indented) use the cursor

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

5
那么什么时候应该关闭光标? - accuya
96
也许更好的做法是明确回答问题,这样人们就不会在不知道工具在做什么以及为什么要用它的情况下使用它。如何考虑“多思考,但使用工具方便”? - Bill Rosmus
2
似乎对代码的可读性不太友好:with closing(connection.cursor()) as cursor: - Walty Yeung
18
傲慢的学究口号构成了整个无意义回答。真正的谜团是为什么它被接受了。这里有一个更好的回答示例:https://dev59.com/b2035IYBdhLWcg3wBLRL#16718647。 - eric
5
一个不太有帮助的回答者可能会用这个不恰当且笼统的标语来回答他们所谓的“答案”。 - ctpenrose
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接