Управление подключением к базе данных с глобальным глобальным именем исчезает
class MyAddon(pyxbmct.AddonDialogWindow):
def __init__(self, title=''):
super(MyAddon, self).__init__(title)
self.mysql_connect()
self.populate()
def populate(self):
categories = self.read_data()
def read_data(self):
query = ("SELECT category FROM test")
cursor = connection.cursor()
categories = cursor.execute(query)
return categories
def mysql_connect(self):
global connection
try:
connection = mysql.connector.connect(**config).cursor()
except mysql.connector.Error as err:
if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
xbmc.executebuiltin('Notification(Error!, Bad user name of password)')
elif err.errno == errorcode.ER_BAD_DB_ERROR:
xbmc.executebuiltin('Notification(Error!, Database does not exist)')
else:
xbmc.executebuiltin('Notification(Error!, {0})'.format(err))
Я разрабатываю дополнение Python для Kodi. Я получаю Global name 'connection' is not defined
ошибка при попытке использовать глобальную переменную для подключения к базе данных. Я не могу прочитать соединение с глобальной переменной из функции read_data. Я уверен, что это не прямая ссылка, потому что я проверял это таким образом.
Целью использования глобальной переменной для соединения является повторное использование соединения во всех функциях без создания нового соединения каждый раз.
1 ответ
Возможно, что Kodi делает что-то напуганное с пространствами имен, или ваши экземпляры засолены; без маринада глобал исчезнет. Другая проблема с глобальным подобным состоянием состоит в том, что соединение может быть потеряно в некоторый момент.
Я реструктурировал бы код, чтобы иметь метод, который возвращает соединение, и использовал бы его во всех методах, которые требуют соединения. Сделайте метод соединения методом класса и разрешите соединение разорваться:
class MyAddonConnectionFailed(Exception): pass
def read_data(self):
query = ("SELECT category FROM test")
try:
conn = self.connect()
except MyAddonConnectionFailed:
# connection failed; error message already displayed
return []
cursor = conn.cursor()
categories = cursor.execute(query)
return categories
_connection = None
@classmethod
def connect(cls):
if cls._connection and cls._connection.open:
return cls._connection
try:
cls._connection = mysql.connector.connect(**config).cursor()
return cls._connection
except mysql.connector.Error as err:
if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
xbmc.executebuiltin('Notification(Error!, Bad user name of password)')
elif err.errno == errorcode.ER_BAD_DB_ERROR:
xbmc.executebuiltin('Notification(Error!, Database does not exist)')
else:
xbmc.executebuiltin('Notification(Error!, {0})'.format(err))
raise MyAddonConnectionFailed
Я поднимаю исключение в connect
classmethod; вам нужно решить, как вы хотите справиться со случаем, когда ваша база данных неправильно настроена или не может подключиться. Отображение сообщения об ошибке недостаточно. Вы все еще можете позвонить self.connect()
от __init__
метод, чтобы сигнализировать об этой проблеме рано, конечно.