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

时间:2014-06-27 16:31:36

标签: python mysql database mysql-python

我正在打开,访问,编写等应用程序中各种类和线程中的数据库。我有一个数据库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 个答案:

答案 0 :(得分:0)

您可以创建单个数据库对象来访问数据库并使用锁定机制(例如Semaphore或RLock)来同步访问此对象。

答案 1 :(得分:0)

  

每次访问后,我应该每次关闭光标吗?

通常不需要关闭MySQLdb光标;它是Python中的一个对象,其行为类似于游标,但不是由MySQL服务器实现或管理的。您可能更愿意关闭光标,这样做并没有错;也许您觉得它使您的代码更容易理解,或者有些情况下您希望捕获并处理与尝试使用不应该可用的游标相关的错误。但是,在使用MySQLdb模块时,您不必担心这些问题。

  

我的应用程序不断运行并在各个不同的点访问数据库,所以我应该在每次访问后关闭数据库,还是只在退出应用程序时关闭数据库?

同样,这取决于您的具体需求和偏好。如果您使用的是user-defined variables,则只有在定义它们的连接保持打开状态时,这些才可用。如果您遇到连接超时问题,那么在高活动期间仅保持连接打开可能会更方便。一般来说,如果您确实需要连续,频繁的访问,那么无限期地保持连接打开并没有错。

至于什么构成"连续,频繁访问,"这可能是您是否遇到服务器超时问题。我有一个需要服务器访问的进程比每秒一次更频繁,这个进程在一周的大部分时间里都在单个打开的连接上运行;我会称之为"持续,频繁的访问。"