86

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

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

MySQL 处理完成后,应关闭connection. 现在我想知道:通过以下方式关闭是否足够connection

connection.close()

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

cursor.close()
connection.close()
4

4 回答 4

79

我将在每个遇到使用 MySQLdb 或任何其他包连接 python2/3 需要知道这一点的 sql 连接的人身上重复最佳实践

(在模拟运行之后假设您的 sql 数据库中有一个名为 tablename 的表。它有 4 个列/字段,名称为 field1、field2、field3、field4)。如果您的连接是本地的(同一台机器),那么它是 127.0.0.1,也称为“localhost”。

过程很简单 7个步骤

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

这是stem mock run的一个简单步骤

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,而是数据库本身中常见的数据结构。

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

于 2018-11-07T00:48:30.573 回答
14

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

cursor = conn.cursor()

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

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

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

在带有 sqlite 的 Python 中是否有必要关闭游标?

于 2013-07-15T23:52:12.317 回答
3

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

于 2011-03-31T18:14:08.050 回答
-30

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

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

(non-indented) cursor is closed.
connection.close()
于 2011-03-31T18:59:31.347 回答