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

#python #mysql #database #mysql-python

#python #mysql #База данных #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()
  

Ответ №1:

Должен ли я закрывать курсор каждый раз после каждого отдельного доступа?

Обычно нет необходимости закрывать MySQLdb курсор; это объект в Python, который ведет себя как курсор, но не реализован или не управляется сервером MySQL. Возможно, вы предпочтете закрыть курсор, и в этом нет ничего плохого; возможно, вы чувствуете, что это облегчает понимание вашего кода, или бывают случаи, когда вы хотите перехватить и обработать ошибку, связанную с попытками использования курсора, который не должен быть доступен. Однако это не то, о чем вам нужно сильно беспокоиться при использовании MySQLdb модуля.

Мое приложение работает постоянно и обращается к базе данных в разных точках, поэтому я должен закрывать базу данных после каждого доступа или закрывать базу данных только при выходе из приложения?

Опять же, это зависит от ваших конкретных потребностей и предпочтений. Если вы используете пользовательские переменные, они будут доступны только пока соединение, в котором они были определены, остается открытым. Если у вас возникли проблемы с тайм-аутом соединения, вам может быть удобнее поддерживать соединение открытым только в периоды высокой активности. Вообще говоря, нет ничего плохого в том, чтобы оставлять соединение открытым на неопределенный срок, если вам действительно нужен постоянный, частый доступ.

Что касается того, что представляет собой «непрерывный, частый доступ», это, вероятно, зависит от того, возникли ли у вас проблемы с тайм-аутом сервера. У меня есть процесс, которому требуется доступ к серверу чаще, чем раз в секунду, который работает по одному открытому соединению большую часть недели; Я бы назвал это «непрерывным, частым доступом».

Ответ №2:

Вы можете создать единый объект базы данных для доступа к базе данных и использовать механизм блокировки (например, семафор или RLock) для синхронизированного доступа к этому объекту.

Комментарии:

1. Вы можете взглянуть на следующие ссылки: docs.python.org/2/library/threading.html и effbot.org/zone/thread-synchronization.htm

2. Я не думаю, что хочу блокировать и синхронизировать доступ к базе данных, поскольку разные потоки обращаются к базе данных независимо друг от друга. Мне просто нужно знать о правильном закрытии курсора и базы данных после каждого вхождения.