【问题标题】:Python mysql - cursor.close() db.close()Python mysql - cursor.close() db.close()
【发布时间】:2014-08-18 20:27:45
【问题描述】:

我在我的应用程序的各种类和线程中打开、访问、写入等数据库。我有一个数据库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()

【问题讨论】:

    标签: python mysql database mysql-python


    【解决方案1】:

    是否应该在每次单独访问后关闭光标?

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      猜你喜欢
      • 2014-08-30
      • 2021-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-20
      • 2018-11-07
      • 1970-01-01
      相关资源
      最近更新 更多