如果我使用MySQLdb通过Python连接到MySQL-Server。我创建了connection
和cursor
,如下所示:
connection = MySQLdb.connect(...)
cursor = connection.cursor()
# process
完成MySQL处理后,应关闭connection
。现在我想知道:通过这样做来关闭connection
是否足够:
connection.close()
或者我必须先关闭cursor
,然后关闭connection
吗?像这样:
cursor.close()
connection.close()
答案 0 :(得分:11)
完成后关闭光标可能是最好的选择,因为你不再使用它了。但是,我没有看到在数据库连接后关闭它有害的任何事情。但是因为您可以将其设置为:
cursor = conn.cursor()
我建议之前关闭它,以防你不小心再次分配它并关闭数据库连接,因为这会引发错误。因此,您可能需要将其关闭第一个,以防止意外重新分配关闭连接。
(有些甚至根本没有关闭它,因为它被垃圾收集器收集(参见: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个步骤
这是进行茎模拟运行的简单步骤
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()