Python mysql - cursor.close() 与 db.close()
我在我的应用程序中,正在不同的类和线程里打开、访问和写入一个数据库。我有一个数据库 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
模块时,这并不是你需要太担心的事情。
我的应用程序一直在运行,并在不同的时刻访问数据库,那么我应该在每次访问后关闭数据库,还是只在应用程序退出时关闭数据库呢?
这又要看你的具体需求和偏好。如果你使用了用户定义变量,这些变量只有在定义它们的连接保持打开时才能使用。如果你遇到连接超时的问题,可能在高峰期只保持连接打开会更方便。一般来说,如果你确实需要频繁、持续地访问,保持连接一直打开也是没问题的。
至于什么算是“持续、频繁的访问”,这可能取决于你是否遇到服务器超时的问题。我有一个进程需要比每秒一次更频繁地访问服务器,这个进程在一个打开的连接上运行了将近一周;我会称之为“持续、频繁的访问”。