Управление подключением к базе данных с глобальным глобальным именем исчезает

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__ метод, чтобы сигнализировать об этой проблеме рано, конечно.

Другие вопросы по тегам