#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. Я не думаю, что хочу блокировать и синхронизировать доступ к базе данных, поскольку разные потоки обращаются к базе данных независимо друг от друга. Мне просто нужно знать о правильном закрытии курсора и базы данных после каждого вхождения.