Python mysql - cursor.close() 与 db.close()

1 投票
2 回答
2957 浏览
提问于 2025-04-18 11:21

我在我的应用程序中,正在不同的类和线程里打开、访问和写入一个数据库。我有一个数据库 self.run_params["db"],我在整个应用程序中都在使用它。

问题 1:我每次访问数据库后都应该关闭游标吗?

问题 2:我的应用程序是持续运行的,并且在不同的时刻访问数据库,那么我应该在每次访问后都关闭数据库,还是只在应用程序退出时关闭数据库呢?

import MySQLdb
import warnings
warnings.filterwarnings('ignore')

self.run_params = {}
self.run_params["databaseName"] = "transporterDatabase"
self.run_params["tableName"] = "transporterTable"

## Create databse if not already exist ##
db = MySQLdb.connect(host="localhost",
                     user="root",
                     passwd="password")
cur = db.cursor()
cur.execute("CREATE DATABASE IF NOT EXISTS " + self.run_params["databaseName"])
db.close()

## Create table if not already exist ##
self.run_params["db"] = MySQLdb.connect(host="localhost",
                     user="root",
                     passwd="password",
                     db=self.run_params["databaseName"])

cur = self.run_params["db"].cursor()
cur.execute("CREATE TABLE IF NOT EXISTS " + self.run_params["tableName"] + "(jobID INT NOT NULL AUTO_INCREMENT, PRIMARY KEY(jobID), location VARCHAR(5000), mode VARCHAR(50), process VARCHAR(10), status VARCHAR(30), title VARCHAR(500), vendorID VARCHAR(100), provider VARCHAR(100), packageType VARCHAR(50), assetUpdate VARCHAR(5), folderSubmission VARCHAR(5), submitTime VARCHAR(50), priority VARCHAR(5));")
cur.close()

######################

## Use database info ##
cur = self.params["db"].cursor()
cur.execute("SELECT * FROM %s order by %s" % (self.params["tableName"], 'priority'))                 

for row in cur.fetchall() :
    jobID = row[0]
    indir1 = row[1]
    runningMode = row[2]
    process = row[3]
    status = row[4]
    title = row[5]
    vendorID = row[6]
    provider = row[7]
    packageType = row[8]
    assetUpdate = row[9]
    folderSubmission = row[10]

cur.close()

2 个回答

-1

你可以创建一个数据库对象来访问数据库,然后使用锁机制(比如Semaphore或RLock)来确保对这个对象的访问是同步的,也就是说,多个地方在使用这个对象的时候不会互相干扰。

1

我每次访问后都应该关闭游标吗?

一般来说,不需要每次都关闭MySQLdb的游标。这个游标在Python中是个对象,虽然它的行为像游标,但并不是由MySQL服务器管理的。你可以选择关闭游标,这样做没有问题;也许你觉得这样能让代码更易懂,或者在某些情况下你想捕捉并处理与游标相关的错误。不过,使用MySQLdb模块时,这并不是你需要太担心的事情。

我的应用程序一直在运行,并在不同的时刻访问数据库,那么我应该在每次访问后关闭数据库,还是只在应用程序退出时关闭数据库呢?

这又要看你的具体需求和偏好。如果你使用了用户定义变量,这些变量只有在定义它们的连接保持打开时才能使用。如果你遇到连接超时的问题,可能在高峰期只保持连接打开会更方便。一般来说,如果你确实需要频繁、持续地访问,保持连接一直打开也是没问题的。

至于什么算是“持续、频繁的访问”,这可能取决于你是否遇到服务器超时的问题。我有一个进程需要比每秒一次更频繁地访问服务器,这个进程在一个打开的连接上运行了将近一周;我会称之为“持续、频繁的访问”。

撰写回答