2016-04-06 5 views
0
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. Я уверен, что это не проблема прямого обращения, потому что я тестировал ее таким образом.Управление соединением базы данных с глобальным глобальным именем исчезает

Целью использования глобальной переменной для соединения является повторное использование соединения во всех функциях без создания нового соединения каждый раз.

+0

Пожалуйста, включите * full traceback *. –

+1

Обратите внимание, что ваш код, как написано, будет * заменять * глобальное 'соединение' каждый раз, когда вы создаете экземпляр; вы не используете ничего здесь. Кстати, вы можете использовать атрибут class вместо глобального; 'connection = None' на уровне класса, тогда' if not MyAddon.connection: MyAddon.connection = ... '; любые попытки * прочитать * 'self.connection' найдут общий атрибут класса. –

ответ

3

Возможно, что Kodi делает что-то напуганное с пространствами имен или ваши экземпляры маринуются; когда uncalled глобальное исчезнет. Другая проблема с глобальным подобным образом заключается в том, что соединение может быть потеряно в какой-то момент.

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

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

+0

Спасибо за предложение шаблона. Не могли бы вы объяснить новичку Python, что делает следующее залоговое право? cursor = .cursor() – PrashanD

+0

@Prashan: это приведет к ошибке, потому что в редактировании я забыл добавить ссылку 'conn' впереди .. Извините за это! –

+0

Последнее, что я заметил, что _connection = None находится в отступе уровня класса. Вы хотели объявить _connection как глобальную переменную? – PrashanD